diff --git a/abi-bindings/go/INativeMinter/INativeMinter.go b/abi-bindings/go/INativeMinter/INativeMinter.go new file mode 100644 index 000000000..308b401a0 --- /dev/null +++ b/abi-bindings/go/INativeMinter/INativeMinter.go @@ -0,0 +1,634 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package inativeminter + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// INativeMinterMetaData contains all meta data concerning the INativeMinter contract. +var INativeMinterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"mintNativeCoin\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"readAllowList\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"role\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAdmin\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEnabled\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setManager\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNone\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"NativeCoinMinted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleSet\",\"inputs\":[{\"name\":\"role\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldRole\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", +} + +// INativeMinterABI is the input ABI used to generate the binding from. +// Deprecated: Use INativeMinterMetaData.ABI instead. +var INativeMinterABI = INativeMinterMetaData.ABI + +// INativeMinter is an auto generated Go binding around an Ethereum contract. +type INativeMinter struct { + INativeMinterCaller // Read-only binding to the contract + INativeMinterTransactor // Write-only binding to the contract + INativeMinterFilterer // Log filterer for contract events +} + +// INativeMinterCaller is an auto generated read-only Go binding around an Ethereum contract. +type INativeMinterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type INativeMinterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type INativeMinterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type INativeMinterSession struct { + Contract *INativeMinter // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// INativeMinterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type INativeMinterCallerSession struct { + Contract *INativeMinterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// INativeMinterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type INativeMinterTransactorSession struct { + Contract *INativeMinterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// INativeMinterRaw is an auto generated low-level Go binding around an Ethereum contract. +type INativeMinterRaw struct { + Contract *INativeMinter // Generic contract binding to access the raw methods on +} + +// INativeMinterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type INativeMinterCallerRaw struct { + Contract *INativeMinterCaller // Generic read-only contract binding to access the raw methods on +} + +// INativeMinterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type INativeMinterTransactorRaw struct { + Contract *INativeMinterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewINativeMinter creates a new instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinter(address common.Address, backend bind.ContractBackend) (*INativeMinter, error) { + contract, err := bindINativeMinter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &INativeMinter{INativeMinterCaller: INativeMinterCaller{contract: contract}, INativeMinterTransactor: INativeMinterTransactor{contract: contract}, INativeMinterFilterer: INativeMinterFilterer{contract: contract}}, nil +} + +// NewINativeMinterCaller creates a new read-only instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterCaller(address common.Address, caller bind.ContractCaller) (*INativeMinterCaller, error) { + contract, err := bindINativeMinter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &INativeMinterCaller{contract: contract}, nil +} + +// NewINativeMinterTransactor creates a new write-only instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterTransactor(address common.Address, transactor bind.ContractTransactor) (*INativeMinterTransactor, error) { + contract, err := bindINativeMinter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &INativeMinterTransactor{contract: contract}, nil +} + +// NewINativeMinterFilterer creates a new log filterer instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterFilterer(address common.Address, filterer bind.ContractFilterer) (*INativeMinterFilterer, error) { + contract, err := bindINativeMinter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &INativeMinterFilterer{contract: contract}, nil +} + +// bindINativeMinter binds a generic wrapper to an already deployed contract. +func bindINativeMinter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := INativeMinterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_INativeMinter *INativeMinterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _INativeMinter.Contract.INativeMinterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_INativeMinter *INativeMinterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _INativeMinter.Contract.INativeMinterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_INativeMinter *INativeMinterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _INativeMinter.Contract.INativeMinterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_INativeMinter *INativeMinterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _INativeMinter.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_INativeMinter *INativeMinterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _INativeMinter.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_INativeMinter *INativeMinterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _INativeMinter.Contract.contract.Transact(opts, method, params...) +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterCaller) ReadAllowList(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _INativeMinter.contract.Call(opts, &out, "readAllowList", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterSession) ReadAllowList(addr common.Address) (*big.Int, error) { + return _INativeMinter.Contract.ReadAllowList(&_INativeMinter.CallOpts, addr) +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterCallerSession) ReadAllowList(addr common.Address) (*big.Int, error) { + return _INativeMinter.Contract.ReadAllowList(&_INativeMinter.CallOpts, addr) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterTransactor) MintNativeCoin(opts *bind.TransactOpts, addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "mintNativeCoin", addr, amount) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterSession) MintNativeCoin(addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.Contract.MintNativeCoin(&_INativeMinter.TransactOpts, addr, amount) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterTransactorSession) MintNativeCoin(addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.Contract.MintNativeCoin(&_INativeMinter.TransactOpts, addr, amount) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetAdmin(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setAdmin", addr) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetAdmin(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetAdmin(&_INativeMinter.TransactOpts, addr) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetAdmin(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetAdmin(&_INativeMinter.TransactOpts, addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetEnabled(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setEnabled", addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetEnabled(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetEnabled(&_INativeMinter.TransactOpts, addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetEnabled(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetEnabled(&_INativeMinter.TransactOpts, addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetManager(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setManager", addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetManager(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetManager(&_INativeMinter.TransactOpts, addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetManager(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetManager(&_INativeMinter.TransactOpts, addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetNone(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setNone", addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetNone(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetNone(&_INativeMinter.TransactOpts, addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetNone(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetNone(&_INativeMinter.TransactOpts, addr) +} + +// INativeMinterNativeCoinMintedIterator is returned from FilterNativeCoinMinted and is used to iterate over the raw logs and unpacked data for NativeCoinMinted events raised by the INativeMinter contract. +type INativeMinterNativeCoinMintedIterator struct { + Event *INativeMinterNativeCoinMinted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *INativeMinterNativeCoinMintedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(INativeMinterNativeCoinMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(INativeMinterNativeCoinMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *INativeMinterNativeCoinMintedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *INativeMinterNativeCoinMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// INativeMinterNativeCoinMinted represents a NativeCoinMinted event raised by the INativeMinter contract. +type INativeMinterNativeCoinMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNativeCoinMinted is a free log retrieval operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) FilterNativeCoinMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*INativeMinterNativeCoinMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _INativeMinter.contract.FilterLogs(opts, "NativeCoinMinted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &INativeMinterNativeCoinMintedIterator{contract: _INativeMinter.contract, event: "NativeCoinMinted", logs: logs, sub: sub}, nil +} + +// WatchNativeCoinMinted is a free log subscription operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) WatchNativeCoinMinted(opts *bind.WatchOpts, sink chan<- *INativeMinterNativeCoinMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _INativeMinter.contract.WatchLogs(opts, "NativeCoinMinted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(INativeMinterNativeCoinMinted) + if err := _INativeMinter.contract.UnpackLog(event, "NativeCoinMinted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNativeCoinMinted is a log parse operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) ParseNativeCoinMinted(log types.Log) (*INativeMinterNativeCoinMinted, error) { + event := new(INativeMinterNativeCoinMinted) + if err := _INativeMinter.contract.UnpackLog(event, "NativeCoinMinted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// INativeMinterRoleSetIterator is returned from FilterRoleSet and is used to iterate over the raw logs and unpacked data for RoleSet events raised by the INativeMinter contract. +type INativeMinterRoleSetIterator struct { + Event *INativeMinterRoleSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *INativeMinterRoleSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(INativeMinterRoleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(INativeMinterRoleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *INativeMinterRoleSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *INativeMinterRoleSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// INativeMinterRoleSet represents a RoleSet event raised by the INativeMinter contract. +type INativeMinterRoleSet struct { + Role *big.Int + Account common.Address + Sender common.Address + OldRole *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleSet is a free log retrieval operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) FilterRoleSet(opts *bind.FilterOpts, role []*big.Int, account []common.Address, sender []common.Address) (*INativeMinterRoleSetIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _INativeMinter.contract.FilterLogs(opts, "RoleSet", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &INativeMinterRoleSetIterator{contract: _INativeMinter.contract, event: "RoleSet", logs: logs, sub: sub}, nil +} + +// WatchRoleSet is a free log subscription operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) WatchRoleSet(opts *bind.WatchOpts, sink chan<- *INativeMinterRoleSet, role []*big.Int, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _INativeMinter.contract.WatchLogs(opts, "RoleSet", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(INativeMinterRoleSet) + if err := _INativeMinter.contract.UnpackLog(event, "RoleSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRoleSet is a log parse operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) ParseRoleSet(log types.Log) (*INativeMinterRoleSet, error) { + event := new(INativeMinterRoleSet) + if err := _INativeMinter.contract.UnpackLog(event, "RoleSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index bc7f00d16..2f6a01a04 100644 --- a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go +++ b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go @@ -31,8 +31,8 @@ var ( // ExampleERC20MetaData contains all meta data concerning the ExampleERC20 contract. var ExampleERC20MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108328061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806370a082311161006e57806370a082311461013f57806379cc67901461016757806395d89b411461017a578063a0712d6814610182578063a9059cbb14610195578063dd62ed3e146101a8575f80fd5b806306fdde03146100b5578063095ea7b3146100d357806318160ddd146100f657806323b872dd14610108578063313ce5671461011b57806342966c681461012a575b5f80fd5b6100bd6101e0565b6040516100ca919061069e565b60405180910390f35b6100e66100e1366004610705565b610270565b60405190151581526020016100ca565b6002545b6040519081526020016100ca565b6100e661011636600461072d565b610289565b604051601281526020016100ca565b61013d610138366004610766565b6102ac565b005b6100fa61014d36600461077d565b6001600160a01b03165f9081526020819052604090205490565b61013d610175366004610705565b6102b9565b6100bd6102d2565b61013d610190366004610766565b6102e1565b6100e66101a3366004610705565b610347565b6100fa6101b636600461079d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101ef906107ce565b80601f016020809104026020016040519081016040528092919081815260200182805461021b906107ce565b80156102665780601f1061023d57610100808354040283529160200191610266565b820191905f5260205f20905b81548152906001019060200180831161024957829003601f168201915b5050505050905090565b5f3361027d818585610354565b60019150505b92915050565b5f33610296858285610366565b6102a18585856103e1565b506001949350505050565b6102b6338261043e565b50565b6102c4823383610366565b6102ce828261043e565b5050565b6060600480546101ef906107ce565b662386f26fc1000081111561033d5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102b63382610472565b5f3361027d8185856103e1565b61036183838360016104a6565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146103db57818110156103cd57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610334565b6103db84848484035f6104a6565b50505050565b6001600160a01b03831661040a57604051634b637e8f60e11b81525f6004820152602401610334565b6001600160a01b0382166104335760405163ec442f0560e01b81525f6004820152602401610334565b610361838383610578565b6001600160a01b03821661046757604051634b637e8f60e11b81525f6004820152602401610334565b6102ce825f83610578565b6001600160a01b03821661049b5760405163ec442f0560e01b81525f6004820152602401610334565b6102ce5f8383610578565b6001600160a01b0384166104cf5760405163e602df0560e01b81525f6004820152602401610334565b6001600160a01b0383166104f857604051634a1406b160e11b81525f6004820152602401610334565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156103db57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056a91815260200190565b60405180910390a350505050565b6001600160a01b0383166105a2578060025f8282546105979190610806565b909155506106129050565b6001600160a01b0383165f90815260208190526040902054818110156105f45760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610334565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661062e5760028054829003905561064c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161069191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156106ca578581018301518582016040015282016106ae565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610700575f80fd5b919050565b5f8060408385031215610716575f80fd5b61071f836106ea565b946020939093013593505050565b5f805f6060848603121561073f575f80fd5b610748846106ea565b9250610756602085016106ea565b9150604084013590509250925092565b5f60208284031215610776575f80fd5b5035919050565b5f6020828403121561078d575f80fd5b610796826106ea565b9392505050565b5f80604083850312156107ae575f80fd5b6107b7836106ea565b91506107c5602084016106ea565b90509250929050565b600181811c908216806107e257607f821691505b60208210810361080057634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028357634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c28061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072e565b60405180910390f35b6101006100fb366004610795565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bd565b6102b6565b604051601281526020016100e4565b610157610152366004610795565b6102d9565b005b6101576101673660046107f6565b610344565b61011461017a36600461080d565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610795565b610351565b6100d7610366565b6101576101bd3660046107f6565b610375565b6101006101d0366004610795565b6103d7565b6101146101e336600461082d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085e565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085e565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e4565b60019150505b92915050565b5f336102c38582856103f6565b6102ce858585610471565b506001949350505050565b678ac7230489e800008111156103365760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61034082826104ce565b5050565b61034e3382610502565b50565b61035c8233836103f6565b6103408282610502565b60606004805461021c9061085e565b678ac7230489e800008111156103cd5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032d565b61034e33826104ce565b5f336102aa818585610471565b6103f18383836001610536565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461046b578181101561045d57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032d565b61046b84848484035f610536565b50505050565b6001600160a01b03831661049a57604051634b637e8f60e11b81525f600482015260240161032d565b6001600160a01b0382166104c35760405163ec442f0560e01b81525f600482015260240161032d565b6103f1838383610608565b6001600160a01b0382166104f75760405163ec442f0560e01b81525f600482015260240161032d565b6103405f8383610608565b6001600160a01b03821661052b57604051634b637e8f60e11b81525f600482015260240161032d565b610340825f83610608565b6001600160a01b03841661055f5760405163e602df0560e01b81525f600482015260240161032d565b6001600160a01b03831661058857604051634a1406b160e11b81525f600482015260240161032d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105fa91815260200190565b60405180910390a350505050565b6001600160a01b038316610632578060025f8282546106279190610896565b909155506106a29050565b6001600160a01b0383165f90815260208190526040902054818110156106845760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106be576002805482900390556106dc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161072191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b8181101561075a5785810183015185820160400152820161073e565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610790575f80fd5b919050565b5f80604083850312156107a6575f80fd5b6107af8361077a565b946020939093013593505050565b5f805f606084860312156107cf575f80fd5b6107d88461077a565b92506107e66020850161077a565b9150604084013590509250925092565b5f60208284031215610806575f80fd5b5035919050565b5f6020828403121561081d575f80fd5b6108268261077a565b9392505050565b5f806040838503121561083e575f80fd5b6108478361077a565b91506108556020840161077a565b90509250929050565b600181811c9082168061087257607f821691505b60208210810361089057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. @@ -451,25 +451,46 @@ func (_ExampleERC20 *ExampleERC20TransactorSession) BurnFrom(account common.Addr return _ExampleERC20.Contract.BurnFrom(&_ExampleERC20.TransactOpts, account, value) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20Transactor) Mint(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.contract.Transact(opts, "mint", account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20Session) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20TransactorSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, account, amount) +} + +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20Transactor) Mint(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.contract.Transact(opts, "mint", amount) +func (_ExampleERC20 *ExampleERC20Transactor) Mint0(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.contract.Transact(opts, "mint0", amount) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20Session) Mint(amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, amount) +func (_ExampleERC20 *ExampleERC20Session) Mint0(amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint0(&_ExampleERC20.TransactOpts, amount) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20TransactorSession) Mint(amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, amount) +func (_ExampleERC20 *ExampleERC20TransactorSession) Mint0(amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint0(&_ExampleERC20.TransactOpts, amount) } // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 87d753bd6..cebf9195c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,8 +83,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b86380380615b8683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a398061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004614dbc565b6103bf565b005b610184610194366004614df7565b610774565b6101d76101a7366004614df7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b610217610212366004614df7565b61092d565b6040516001600160401b0390911681526020016101e1565b61018461023d366004614e22565b610943565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004614e60565b610a22565b61018461027f366004614e79565b610a75565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004614ea1565b610c4a565b6101d76102c2366004614f05565b61127e565b6102176102d5366004614df7565b611297565b6101846102e8366004614dbc565b6112ab565b6101f2603081565b610184610303366004614e79565b61138c565b6101d7610316366004614f1e565b6115b9565b610184610329366004614e60565b6115e5565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b610184610362366004614df7565b61179d565b610184610375366004614df7565b611a23565b6101f2601481565b610395610390366004614df7565b611b37565b6040516101e19190614f52565b6102176202a30081565b6101d76103ba366004615019565b611c2a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061598d8339815191529184156104115761040e8285611c5f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044357610443614f3e565b600481111561045457610454614f3e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104d084611b37565b90506002825160048111156104e7576104e7614f3e565b146105395760405162461bcd60e51b815260206004820152602a60248201525f805160206159ad8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461059e5760405162461bcd60e51b815260206004820152603360248201525f805160206159ad8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610530565b60038252805160029060058111156105b8576105b8614f3e565b036105fc575f826060015182608001516105d29190615092565b90506105de8582611efb565b506001600160401b0390811660e0850152421660a08401525061061d565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561064e5761064e614f3e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610762916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615a0d8339815191526020526040808220815160e0810190925280545f805160206159cd83398151915293929190829060ff1660058111156107c1576107c1614f3e565b60058111156107d2576107d2614f3e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561084157610841614f3e565b146108a65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610530565b6005600160991b016001600160a01b031663ee5b48eb6108cb8584606001515f612052565b6040518263ffffffff1660e01b81526004016108e791906150d4565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109279190615106565b50505050565b5f61093d64e8d4a510008361511d565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061098c575080546001600160401b03808416911610155b156109aa5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109d58484612279565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8051602061598d8339815191525f80610a3b84612293565b6040808201515f848152600588016020529190912054929450909250610927916001600160401b03909116906001600160a01b031661260b565b5f8051602061598d8339815191525f610a8d84612641565b90505f80610a9e836040015161281b565b50915091505f610aad83611b37565b9050816001600160401b031681606001516001600160401b03161015610ae55760405162461bcd60e51b81526004016105309061513c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b2a5760405162461bcd60e51b81526004016105309061517e565b60015f87815260068701602052604090205460ff166004811115610b5057610b50614f3e565b14610bb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610530565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159cd8339815191529060ff1615610ce75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610530565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4e9190615106565b836020013514610db05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610530565b30610dc160608501604086016151c7565b6001600160a01b031614610e335760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610530565b5f610e4160608501856151e2565b91505f9050843560208601356014610e5f6060890160408a016151c7565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561118e575f610edf60608901896151e2565b8363ffffffff16818110610ef557610ef5615227565b9050602002810190610f07919061523b565b610f10906152eb565b80515f8181526009890160205260409020549192509015610f435760405162461bcd60e51b815260040161053090615382565b84825f015183602001518460400151604051602001610f6594939291906153ca565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610fb39190615419565b602060405180830381855afa158015610fce573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ff19190615106565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561107d5761107d614f3e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161113091168661542a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111879061543d565b9050610ec3565b50600584018190555f6111a086612641565b90505f6111b08260400151612a56565b9050806002856040516111c39190615419565b602060405180830381855afa1580156111de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112019190615106565b146112655760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610530565b505050600a909201805460ff1916600117905550505050565b5f61093d6001600160401b03831664e8d4a5100061545f565b5f6112a182611b37565b6080015192915050565b5f8051602061598d8339815191525f6112c385611b37565b5f86815260058401602052604090205460a08201519192506112f691600160b01b9091046001600160401b031690615476565b6001600160401b031642101561136a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610530565b831561137c5761137a8584611c5f565b505b61138585612bc8565b5050505050565b611394612e39565b5f8051602061598d8339815191525f6113ac84612641565b90505f806113bd836040015161281b565b50915091505f6113cc83611b37565b9050816001600160401b031681606001516001600160401b031610156114045760405162461bcd60e51b81526004016105309061513c565b5f8681526006860160205260409020600301546001600160401b03808416911611156114425760405162461bcd60e51b81526004016105309061517e565b60035f87815260068701602052604090205460ff16600481111561146857611468614f3e565b146114bc5760405162461bcd60e51b815260206004820152603160248201525f805160206159ad8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610530565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526115619161260b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506115b560015f805160206159ed83398151915255565b5050565b5f6115c2612e39565b6115cd833384612e83565b905061093d60015f805160206159ed83398151915255565b5f805160206159cd8339815191525f6115fd83612641565b90505f8061160e836040015161326b565b91509150806116705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610530565b5f8281526007850160205260408120805461168a90615496565b90501180156116bc575060015f83815260088601602052604090205460ff1660058111156116ba576116ba614f3e565b145b6116d85760405162461bcd60e51b8152600401610530906154ce565b5f82815260078501602052604081206116f091614d4d565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061598d83398151915293929190829060ff1660048111156117fe576117fe614f3e565b600481111561180f5761180f614f3e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561189657611896614f3e565b14806118b457506003815160048111156118b2576118b2614f3e565b145b6119085760405162461bcd60e51b815260206004820152603260248201525f805160206159ad833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610530565b5f6119168260400151611b37565b905080606001516001600160401b03165f0361199a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610530565b6005600160991b016001600160a01b031663ee5b48eb6119c7846040015184606001518560800151612052565b6040518263ffffffff1660e01b81526004016119e391906150d4565b6020604051808303815f875af11580156119ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113859190615106565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206159cd833981519152929190611a6b90615496565b9050118015611a9d575060015f83815260088301602052604090205460ff166005811115611a9b57611a9b614f3e565b145b611ab95760405162461bcd60e51b8152600401610530906154ce565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611af29190600401615515565b6020604051808303815f875af1158015611b0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b329190615106565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615a0d83398151915290528390208351918201909352825491925f805160206159cd83398151915292829060ff166005811115611bb757611bb7614f3e565b6005811115611bc857611bc8614f3e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611c33612e39565b611c3f8585858561340c565b9050611c5760015f805160206159ed83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611caa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cd191908101906155aa565b9150915080611d345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610530565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9b9190615106565b825114611dff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610530565b60208201516001600160a01b031615611e755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610530565b5f80611e848460400151613681565b91509150818714611ef15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610530565b9695505050505050565b5f8281525f80516020615a0d833981519152602052604081206002015481905f805160206159cd83398151915290600160801b90046001600160401b0316611f438582613859565b5f611f4d87613a67565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f9d8a858b612052565b6040518263ffffffff1660e01b8152600401611fb991906150d4565b6020604051808303815f875af1158015611fd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff99190615106565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120cb5761208b81600161567c565b61209690600861545f565b5081515f908390839081106120ad576120ad615227565b60200101906001600160f81b03191690815f1a905350600101612077565b505f5b6004811015612136576120e281600361567c565b6120ed90600861545f565b600263ffffffff16901c60f81b82826002612108919061542a565b8151811061211857612118615227565b60200101906001600160f81b03191690815f1a9053506001016120ce565b505f5b60208110156121985761214d81601f61567c565b61215890600861545f565b86901c60f81b8261216a83600661542a565b8151811061217a5761217a615227565b60200101906001600160f81b03191690815f1a905350600101612139565b505f5b6008811015612203576121af81600761567c565b6121ba90600861545f565b6001600160401b038616901c60f81b826121d583602661542a565b815181106121e5576121e5615227565b60200101906001600160f81b03191690815f1a90535060010161219b565b505f5b600881101561226e5761221a81600761567c565b61222590600861545f565b6001600160401b038516901c60f81b8261224083602e61542a565b8151811061225057612250615227565b60200101906001600160f81b03191690815f1a905350600101612206565b5090505b9392505050565b612281613af7565b61228a82613b42565b6115b581613bb9565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206159cd8339815191525f6122e285612641565b90505f806122f3836040015161326b565b9150915080156123585760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610530565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561238957612389614f3e565b600581111561239a5761239a614f3e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561240b5761240b614f3e565b1480612429575060018251600581111561242757612427614f3e565b145b6124885760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610530565b60038251600581111561249d5761249d614f3e565b036124aa575060046124ae565b5060055b6020808301515f908152600988019091526040812055818160058111156124d7576124d7614f3e565b908160058111156124ea576124ea614f3e565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561251e5761251e614f3e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125d2576125d2614f3e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546115b5906001600160a01b03168284613c6d565b60408051606080820183525f8083526020830181905292820152905f805160206159cd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126b6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126dd91908101906155aa565b915091508061273d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610530565b82548251146127a05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610530565b60208201516001600160a01b0316156128135760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610530565b509392505050565b5f805f835160361461283f5760405162461bcd60e51b81526004016105309061568f565b5f805b600281101561288e5761285681600161567c565b61286190600861545f565b61ffff1686828151811061287757612877615227565b016020015160f81c901b9190911790600101612842565b5061ffff8116156128b15760405162461bcd60e51b8152600401610530906156d8565b5f805b600481101561290c576128c881600361567c565b6128d390600861545f565b63ffffffff16876128e583600261542a565b815181106128f5576128f5615227565b016020015160f81c901b91909117906001016128b4565b5063ffffffff81166004146129335760405162461bcd60e51b81526004016105309061571b565b5f805b60208110156129885761294a81601f61567c565b61295590600861545f565b8861296183600661542a565b8151811061297157612971615227565b016020015160f81c901b9190911790600101612936565b505f805b60088110156129e7576129a081600761567c565b6129ab90600861545f565b6001600160401b0316896129c083602661542a565b815181106129d0576129d0615227565b016020015160f81c901b919091179060010161298c565b505f805b6008811015612a46576129ff81600761567c565b612a0a90600861545f565b6001600160401b03168a612a1f83602e61542a565b81518110612a2f57612a2f615227565b016020015160f81c901b91909117906001016129eb565b5091989097509095509350505050565b5f8151602614612a785760405162461bcd60e51b81526004016105309061568f565b5f805b6002811015612ac757612a8f81600161567c565b612a9a90600861545f565b61ffff16848281518110612ab057612ab0615227565b016020015160f81c901b9190911790600101612a7b565b5061ffff811615612aea5760405162461bcd60e51b8152600401610530906156d8565b5f805b6004811015612b4557612b0181600361567c565b612b0c90600861545f565b63ffffffff1685612b1e83600261542a565b81518110612b2e57612b2e615227565b016020015160f81c901b9190911790600101612aed565b5063ffffffff811615612b6a5760405162461bcd60e51b81526004016105309061571b565b5f805b6020811015612bbf57612b8181601f61567c565b612b8c90600861545f565b86612b9883600661542a565b81518110612ba857612ba8615227565b016020015160f81c901b9190911790600101612b6d565b50949350505050565b5f8181525f80516020615a0d8339815191526020526040808220815160e0810190925280545f805160206159cd83398151915293929190829060ff166005811115612c1557612c15614f3e565b6005811115612c2657612c26614f3e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612c9857612c98614f3e565b14612cf45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610530565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612d3857612d38614f3e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612de48482611efb565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f805160206159ed833981519152805460011901612e6a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206159ed83398151915255565b5f5f8051602061598d83398151915281612e9f61021285613ccc565b90505f612eab87611b37565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b0316612f415760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610530565b600281516005811115612f5657612f56614f3e565b14612fb55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610530565b5f828260800151612fc69190615476565b60048501546040840151919250612fe8916001600160401b0390911690615762565b6001600160401b0316816001600160401b031611156130675760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610530565b5f806130738a84611efb565b915091505f8a836040516020016130a192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561313c5761313c614f3e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461328e5760405162461bcd60e51b81526004016105309061568f565b5f805b60028110156132dd576132a581600161567c565b6132b090600861545f565b61ffff168582815181106132c6576132c6615227565b016020015160f81c901b9190911790600101613291565b5061ffff8116156133005760405162461bcd60e51b8152600401610530906156d8565b5f805b600481101561335b5761331781600361567c565b61332290600861545f565b63ffffffff168661333483600261542a565b8151811061334457613344615227565b016020015160f81c901b9190911790600101613303565b5063ffffffff81166003146133825760405162461bcd60e51b81526004016105309061571b565b5f805b60208110156133d75761339981601f61567c565b6133a490600861545f565b876133b083600661542a565b815181106133c0576133c0615227565b016020015160f81c901b9190911790600101613385565b505f866026815181106133ec576133ec615227565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061598d8339815191529061ffff861610801590613458575061271061ffff861611155b6134745760405162461bcd60e51b81526004016105309061578d565b60028101546001600160401b0390811690851610156134ed5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610530565b80548310156135505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610530565b80600101548311156135b75760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610530565b5f6135c184613ccc565b90505f6135cd8261092d565b90505f6135da8983613d02565b905060405180606001604052806135ee3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146136a45760405162461bcd60e51b81526004016105309061568f565b5f805b60028110156136f3576136bb81600161567c565b6136c690600861545f565b61ffff168582815181106136dc576136dc615227565b016020015160f81c901b91909117906001016136a7565b5061ffff8116156137165760405162461bcd60e51b8152600401610530906156d8565b5f805b60048110156137715761372d81600361567c565b61373890600861545f565b63ffffffff168661374a83600261542a565b8151811061375a5761375a615227565b016020015160f81c901b9190911790600101613719565b5063ffffffff81166005146137985760405162461bcd60e51b81526004016105309061571b565b5f805b60208110156137ed576137af81601f61567c565b6137ba90600861545f565b876137c683600661542a565b815181106137d6576137d6615227565b016020015160f81c901b919091179060010161379b565b505f805b600881101561384c5761380581600761567c565b61381090600861545f565b6001600160401b03168861382583602661542a565b8151811061383557613835615227565b016020015160f81c901b91909117906001016137f1565b5090969095509350505050565b5f805160206159cd8339815191525f6001600160401b03808416908516111561388d576138868385615092565b905061389a565b6138978484615092565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806138fc5750600284015481516138f8916001600160401b03169061542a565b8210155b15613922576001600160401b038316606082015281815260408101516020820152613941565b82816060018181516139349190615476565b6001600160401b03169052505b6060810151613951906064615762565b602082015160028601546001600160401b03929092169161397c9190600160401b900460ff1661545f565b10156139e05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610530565b856001600160401b0316816040018181516139fb919061542a565b9052506040810180516001600160401b0387169190613a1b90839061567c565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a0d8339815191526020526040812060020180545f805160206159cd83398151915291600160401b9091046001600160401b0316906008613ab1836157d8565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b4057604051631afcd79f60e31b815260040160405180910390fd5b565b613b4a613af7565b613b5381614267565b613b5b614280565b613bb6608082013560a0830135613b7860e0850160c08601614f05565b613b89610100860160e087016157f3565b61ffff16613b9f6101208701610100880161580c565b613bb1610140880161012089016151c7565b614290565b50565b613bc1613af7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613c4d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610530565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611b3291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506144d4565b5f61093d827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614535565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613d8d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610530565b5f805160206159cd83398151915242613dac6040860160208701614f05565b6001600160401b031611613e1e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610530565b613e2e6040850160208601614f05565b6001600160401b0316613e446202a3004261542a565b11613eb75760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610530565b8335613f0f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610530565b83355f90815260098201602052604090205415613f3e5760405162461bcd60e51b815260040161053090615382565b6030613f4d604086018661582c565b905014613fb25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610530565b613fbc835f613859565b5f806140566040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140019190614f05565b6001600160401b0316815260200161401c60408a018a61582c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614697565b5f8281526007860160205260409020919350915061407482826158b2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140a19085906004016150d4565b6020604051808303815f875af11580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190615106565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561415957614159614f3e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614239918e01908e01614f05565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61426f613af7565b614277614a46565b613bb681614a4e565b614288613af7565b613b40614bf0565b614298613af7565b5f8051602061598d833981519152836143045760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610530565b6127108411156143265760405162461bcd60e51b81526004016105309061578d565b8587111561438e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610530565b5f8360ff16116143fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610530565b600a60ff8416111561446d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610530565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6144e86001600160a01b03841683614bf8565b905080515f1415801561450c57508080602001905181019061450a9190615971565b155b15611b3257604051635274afe760e01b81526001600160a01b0384166004820152602401610530565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561457b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459f9190615106565b90506145b66001600160a01b038516333086614c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156145fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461e9190615106565b90508181116146845760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610530565b61468e828261567c565b95945050505050565b5f60608260800151516030146147015760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610530565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156147785761473881600161567c565b61474390600861545f565b5081515f9083908390811061475a5761475a615227565b60200101906001600160f81b03191690815f1a905350600101614724565b505f5b60048110156147e05761478f81600361567c565b61479a90600861545f565b600160ff919091161c60f81b826147b283600261542a565b815181106147c2576147c2615227565b60200101906001600160f81b03191690815f1a90535060010161477b565b505f5b602081101561483d57845181602081106147ff576147ff615227565b1a60f81b8261480f83600661542a565b8151811061481f5761481f615227565b60200101906001600160f81b03191690815f1a9053506001016147e3565b505f5b602081101561489d578460200151816020811061485f5761485f615227565b1a60f81b8261486f83602661542a565b8151811061487f5761487f615227565b60200101906001600160f81b03191690815f1a905350600101614840565b505f5b6008811015614911576148b481600761567c565b6148bf90600861545f565b60ff1685604001516001600160401b0316901c60f81b828260466148e3919061542a565b815181106148f3576148f3615227565b60200101906001600160f81b03191690815f1a9053506001016148a0565b505f5b603081101561497c578460800151818151811061493357614933615227565b01602001516001600160f81b0319168261494e83604e61542a565b8151811061495e5761495e615227565b60200101906001600160f81b03191690815f1a905350600101614914565b505f5b60088110156149ee5761499381600761567c565b61499e90600861545f565b60608601516001600160401b0390811691161c60f81b826149c083607e61542a565b815181106149d0576149d0615227565b60200101906001600160f81b03191690815f1a90535060010161497f565b506002816040516149ff9190615419565b602060405180830381855afa158015614a1a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a3d9190615106565b94909350915050565b613b40613af7565b614a56613af7565b80355f805160206159cd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614aa2608084016060850161580c565b60ff161115614b0f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610530565b5f614b20608084016060850161580c565b60ff1611614b885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610530565b614b98608083016060840161580c565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614bc96060830160408401614f05565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e70613af7565b606061227283835f614c3e565b6040516001600160a01b0384811660248301528381166044830152606482018390526109279186918216906323b872dd90608401613c9a565b606081471015614c635760405163cd78605960e01b8152306004820152602401610530565b5f80856001600160a01b03168486604051614c7e9190615419565b5f6040518083038185875af1925050503d805f8114614cb8576040519150601f19603f3d011682016040523d82523d5f602084013e614cbd565b606091505b5091509150611ef1868383606082614cdd57614cd882614d24565b612272565b8151158015614cf457506001600160a01b0384163b155b15614d1d57604051639996b31560e01b81526001600160a01b0385166004820152602401610530565b5080612272565b805115614d345780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614d5990615496565b5f825580601f10614d68575050565b601f0160209004905f5260205f2090810190613bb691905b80821115614d93575f8155600101614d80565b5090565b8015158114613bb6575f80fd5b803563ffffffff81168114614db7575f80fd5b919050565b5f805f60608486031215614dce575f80fd5b833592506020840135614de081614d97565b9150614dee60408501614da4565b90509250925092565b5f60208284031215614e07575f80fd5b5035919050565b6001600160a01b0381168114613bb6575f80fd5b5f80828403610160811215614e35575f80fd5b61014080821215614e44575f80fd5b8493508301359050614e5581614e0e565b809150509250929050565b5f60208284031215614e70575f80fd5b61227282614da4565b5f8060408385031215614e8a575f80fd5b614e9383614da4565b946020939093013593505050565b5f8060408385031215614eb2575f80fd5b82356001600160401b03811115614ec7575f80fd5b830160808186031215614ed8575f80fd5b9150614ee660208401614da4565b90509250929050565b80356001600160401b0381168114614db7575f80fd5b5f60208284031215614f15575f80fd5b61227282614eef565b5f8060408385031215614f2f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614f7557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fb060608401826001600160401b03169052565b506080830151614fcb60808401826001600160401b03169052565b5060a0830151614fe660a08401826001600160401b03169052565b5060c083015161500160c08401826001600160401b03169052565b5092915050565b803561ffff81168114614db7575f80fd5b5f805f806080858703121561502c575f80fd5b84356001600160401b03811115615041575f80fd5b850160608188031215615052575f80fd5b935061506060208601615008565b925061506e60408601614eef565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156150015761500161507e565b5f5b838110156150cc5781810151838201526020016150b4565b50505f910152565b602081525f82518060208401526150f28160408501602087016150b2565b601f01601f19169190910160400192915050565b5f60208284031215615116575f80fd5b5051919050565b5f8261513757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156151d7575f80fd5b813561227281614e0e565b5f808335601e198436030181126151f7575f80fd5b8301803591506001600160401b03821115615210575f80fd5b6020019150600581901b360382131561204b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261524f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561528f5761528f615259565b60405290565b604051601f8201601f191681016001600160401b03811182821017156152bd576152bd615259565b604052919050565b5f6001600160401b038211156152dd576152dd615259565b50601f01601f191660200190565b5f606082360312156152fb575f80fd5b61530361526d565b823581526020615314818501614eef565b8183015260408401356001600160401b03811115615330575f80fd5b840136601f820112615340575f80fd5b803561535361534e826152c5565b615295565b8181523684838501011115615366575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153db818460208a016150b2565b80830190508581526001600160401b0360c01b8560c01b166020820152835161540b8160288401602088016150b2565b016028019695505050505050565b5f825161524f8184602087016150b2565b8082018082111561093d5761093d61507e565b5f63ffffffff8083168181036154555761545561507e565b6001019392505050565b808202811582820484141761093d5761093d61507e565b6001600160401b038181168382160190808211156150015761500161507e565b600181811c908216806154aa57607f821691505b6020821081036154c857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461552781615496565b806020870152604060018084165f8114615548576001811461556457615591565b60ff19851660408a0152604084151560051b8a01019550615591565b895f5260205f205f5b858110156155885781548b820186015290830190880161556d565b8a016040019650505b509398975050505050505050565b8051614db781614d97565b5f80604083850312156155bb575f80fd5b82516001600160401b03808211156155d1575f80fd5b90840190606082870312156155e4575f80fd5b6155ec61526d565b825181526020808401516155ff81614e0e565b82820152604084015183811115615614575f80fd5b80850194505087601f850112615628575f80fd5b8351925061563861534e846152c5565b838152888285870101111561564b575f80fd5b61565a848383018488016150b2565b8060408401525081955061566f81880161559f565b9450505050509250929050565b8181038181111561093d5761093d61507e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157855761578561507e565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036154555761545561507e565b5f60208284031215615803575f80fd5b61227282615008565b5f6020828403121561581c575f80fd5b813560ff81168114612272575f80fd5b5f808335601e19843603018112615841575f80fd5b8301803591506001600160401b0382111561585a575f80fd5b60200191503681900382131561204b575f80fd5b601f821115611b3257805f5260205f20601f840160051c810160208510156158935750805b601f840160051c820191505b81811015611385575f815560010161589f565b81516001600160401b038111156158cb576158cb615259565b6158df816158d98454615496565b8461586e565b602080601f831160018114615912575f84156158fb5750858301515b5f19600386901b1c1916600185901b178555615969565b5f85815260208120601f198616915b8281101561594057888601518255948401946001909101908401615921565b508582101561595d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615981575f80fd5b815161227281614d9756fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160fc3803806160fc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615faf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c0565b6103ec565b005b61019e6101ae3660046152fb565b610890565b6101f16101c13660046152fb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fb565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615326565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615364565b610b3e565b61019e61029936600461537d565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a5565b610db3565b6101f16102dc366004615409565b6113e7565b6102316102ef3660046152fb565b611400565b61019e6103023660046152c0565b611414565b61020c603081565b61019e61031d3660046152fb565b611657565b61019e61033036600461537d565b61175d565b6101f1610343366004615422565b611a81565b61019e610356366004615364565b611aad565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fb565b611c65565b61019e6103a23660046152fb565b611eeb565b61020c601481565b6103c26103bd3660046152fb565b611fff565b6040516101fb9190615456565b6102316202a30081565b6101f16103e736600461551d565b6120c7565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff16600481111561044d5761044d615442565b600481111561045e5761045e615442565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fff565b90506002835160048111156104f9576104f9615442565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615442565b036106235786156105e4576105e183876120fc565b90505b5f846060015183608001516105f99190615596565b90506106058482612398565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906155b6565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615442565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff1660058111156108dd576108dd615442565b60058111156108ee576108ee615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615442565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ef565b6040518263ffffffff1660e01b8152600401610a0391906155ef565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906155b6565b50505050565b5f610a5964e8d4a5100083615621565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612716565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615f038339815191525f80610b5784612730565b91509150610b6482612a7a565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615442565b03610bc1575f83815260088501602052604081208054919055610bbf8282612ab5565b505b610bd781610bd284604001516113e7565b612b2b565b5050505050565b5f80516020615f038339815191525f610bf684612b4e565b90505f80610c078360400151612d28565b50915091505f610c1683611fff565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615640565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615682565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615442565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f438339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906155b6565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156cb565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156e6565b91505f9050843560208601356014610fc86060890160408a016156cb565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156e6565b8363ffffffff1681811061105e5761105e61572b565b9050602002810190611070919061573f565b611079906157ef565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615886565b84825f0151836020015184604001516040516020016110ce94939291906158ce565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c919061591d565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a91906155b6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615442565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661592e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615941565b905061102c565b50600584018190555f61130986612b4e565b90505f6113198260400151612f63565b90508060028560405161132c919061591d565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a91906155b6565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615963565b5f61140a82611fff565b6080015192915050565b5f80516020615f038339815191525f61142c856130d5565b905061143785612a7a565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061597a565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159cc565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120fc565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b91906155b6565b5f8781526008850160205260408120805490919061164a90849061592e565b9091555050505050505050565b5f80516020615f038339815191525f61166f83611fff565b905060048151600581111561168657611686615442565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061597a565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612ab5565b611765613350565b5f80516020615f038339815191525f61177d84612b4e565b90505f8061178e8360400151612d28565b50915091505f61179d83611fff565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615442565b60048111156117e8576117e8615442565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615640565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615682565b60038151600481111561191757611917615442565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615963565b6119b69190615621565b905080886008015f8881526020019081526020015f205f8282546119da919061592e565b909155505f90506119eb82846159ec565b90506119fb846020015182612ab5565b611a108460200151610bd286606001516113e7565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611a56929190918252602082015260400190565b60405180910390a4505050505050505050611a7d60015f80516020615f6383398151915255565b5050565b5f611a8a613350565b611a9583338461339a565b9050610a5960015f80516020615f6383398151915255565b5f80516020615f438339815191525f611ac583612b4e565b90505f80611ad68360400151613754565b9150915080611b385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b52906159ff565b9050118015611b84575060015f83815260088601602052604090205460ff166005811115611b8257611b82615442565b145b611ba05760405162461bcd60e51b815260040161054290615a37565b5f8281526007850160205260408120611bb891615210565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff166004811115611cc657611cc6615442565b6004811115611cd757611cd7615442565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5e57611d5e615442565b1480611d7c5750600381516004811115611d7a57611d7a615442565b145b611dd05760405162461bcd60e51b815260206004820152603260248201525f80516020615f23833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dde8260400151611fff565b905080606001516001600160401b03165f03611e625760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e8f8460400151846060015185608001516124ef565b6040518263ffffffff1660e01b8152600401611eab91906155ef565b6020604051808303815f875af1158015611ec7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906155b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f43833981519152929190611f33906159ff565b9050118015611f65575060015f83815260088301602052604090205460ff166005811115611f6357611f63615442565b145b611f815760405162461bcd60e51b815260040161054290615a37565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fba9190600401615a7e565b6020604051808303815f875af1158015611fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906155b6565b505050565b612007615247565b5f8281525f80516020615f83833981519152602052604090819020815160e0810190925280545f80516020615f43833981519152929190829060ff16600581111561205457612054615442565b600581111561206557612065615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d0613350565b6120dc858585856138f5565b90506120f460015f80516020615f6383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612147573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216e9190810190615b13565b91509150806121d15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223891906155b6565b82511461229c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156123125760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123218460400151613b6a565b9150915081871461238e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f83833981519152602052604081206002015481905f80516020615f4383398151915290600160801b90046001600160401b03166123e08582613d42565b5f6123ea87613f50565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243a8a858b6124ef565b6040518263ffffffff1660e01b815260040161245691906155ef565b6020604051808303815f875af1158015612472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249691906155b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612568576125288160016159ec565b612533906008615963565b5081515f9083908390811061254a5761254a61572b565b60200101906001600160f81b03191690815f1a905350600101612514565b505f5b60048110156125d35761257f8160036159ec565b61258a906008615963565b600263ffffffff16901c60f81b828260026125a5919061592e565b815181106125b5576125b561572b565b60200101906001600160f81b03191690815f1a90535060010161256b565b505f5b6020811015612635576125ea81601f6159ec565b6125f5906008615963565b86901c60f81b8261260783600661592e565b815181106126175761261761572b565b60200101906001600160f81b03191690815f1a9053506001016125d6565b505f5b60088110156126a05761264c8160076159ec565b612657906008615963565b6001600160401b038616901c60f81b8261267283602661592e565b815181106126825761268261572b565b60200101906001600160f81b03191690815f1a905350600101612638565b505f5b600881101561270b576126b78160076159ec565b6126c2906008615963565b6001600160401b038516901c60f81b826126dd83602e61592e565b815181106126ed576126ed61572b565b60200101906001600160f81b03191690815f1a9053506001016126a3565b5090505b9392505050565b61271e613fe0565b6127278261402b565b611a7d816140a2565b5f612739615247565b5f80516020615f438339815191525f61275185612b4e565b90505f806127628360400151613754565b9150915080156127c75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f8576127f8615442565b600581111561280957612809615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287a5761287a615442565b1480612898575060018251600581111561289657612896615442565b145b6128f75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561290c5761290c615442565b036129195750600461291d565b5060055b6020808301515f9081526009880190915260408120558181600581111561294657612946615442565b9081600581111561295957612959615442565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298d5761298d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4157612a41615442565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ee383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b10575f80fd5b505af1158015612b22573d5f803e3d5ffd5b50505050505050565b5f80516020615ee383398151915254611a7d906001600160a01b03168383614143565b60408051606080820183525f8083526020830181905292820152905f80516020615f438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bea9190810190615b13565b9150915080612c4a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612cad5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d4c5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612d9b57612d638160016159ec565b612d6e906008615963565b61ffff16868281518110612d8457612d8461572b565b016020015160f81c901b9190911790600101612d4f565b5061ffff811615612dbe5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015612e1957612dd58160036159ec565b612de0906008615963565b63ffffffff1687612df283600261592e565b81518110612e0257612e0261572b565b016020015160f81c901b9190911790600101612dc1565b5063ffffffff8116600414612e405760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015612e9557612e5781601f6159ec565b612e62906008615963565b88612e6e83600661592e565b81518110612e7e57612e7e61572b565b016020015160f81c901b9190911790600101612e43565b505f805b6008811015612ef457612ead8160076159ec565b612eb8906008615963565b6001600160401b031689612ecd83602661592e565b81518110612edd57612edd61572b565b016020015160f81c901b9190911790600101612e99565b505f805b6008811015612f5357612f0c8160076159ec565b612f17906008615963565b6001600160401b03168a612f2c83602e61592e565b81518110612f3c57612f3c61572b565b016020015160f81c901b9190911790600101612ef8565b5091989097509095509350505050565b5f8151602614612f855760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612fd457612f9c8160016159ec565b612fa7906008615963565b61ffff16848281518110612fbd57612fbd61572b565b016020015160f81c901b9190911790600101612f88565b5061ffff811615612ff75760405162461bcd60e51b815260040161054290615c2e565b5f805b60048110156130525761300e8160036159ec565b613019906008615963565b63ffffffff168561302b83600261592e565b8151811061303b5761303b61572b565b016020015160f81c901b9190911790600101612ffa565b5063ffffffff8116156130775760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156130cc5761308e81601f6159ec565b613099906008615963565b866130a583600661592e565b815181106130b5576130b561572b565b016020015160f81c901b919091179060010161307a565b50949350505050565b6130dd615247565b5f8281525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff16600581111561312a5761312a615442565b600581111561313b5761313b615442565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ad576131ad615442565b146132095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324d5761324d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f98582612398565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f6383398151915280546001190161338157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f6383398151915255565b5f5f80516020615f03833981519152816133b661022c856141a2565b90505f6133c287611fff565b90506133cd87612a7a565b61342a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561343f5761343f615442565b1461349e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516134af91906159cc565b600485015460408401519192506134d1916001600160401b0390911690615cb8565b6001600160401b0316816001600160401b031611156135505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061355c8a84612398565b915091505f8a8360405160200161358a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362557613625615442565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137775760405162461bcd60e51b815260040161054290615be5565b5f805b60028110156137c65761378e8160016159ec565b613799906008615963565b61ffff168582815181106137af576137af61572b565b016020015160f81c901b919091179060010161377a565b5061ffff8116156137e95760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613844576138008160036159ec565b61380b906008615963565b63ffffffff168661381d83600261592e565b8151811061382d5761382d61572b565b016020015160f81c901b91909117906001016137ec565b5063ffffffff811660031461386b5760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156138c05761388281601f6159ec565b61388d906008615963565b8761389983600661592e565b815181106138a9576138a961572b565b016020015160f81c901b919091179060010161386e565b505f866026815181106138d5576138d561572b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f038339815191529061ffff861610801590613941575061271061ffff861611155b61395d5760405162461bcd60e51b815260040161054290615ce3565b60028101546001600160401b0390811690851610156139d65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613aa05760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613aaa846141a2565b90505f613ab682610a49565b90505f613ac389836141c5565b90506040518060600160405280613ad73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8d5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015613bdc57613ba48160016159ec565b613baf906008615963565b61ffff16858281518110613bc557613bc561572b565b016020015160f81c901b9190911790600101613b90565b5061ffff811615613bff5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613c5a57613c168160036159ec565b613c21906008615963565b63ffffffff1686613c3383600261592e565b81518110613c4357613c4361572b565b016020015160f81c901b9190911790600101613c02565b5063ffffffff8116600514613c815760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015613cd657613c9881601f6159ec565b613ca3906008615963565b87613caf83600661592e565b81518110613cbf57613cbf61572b565b016020015160f81c901b9190911790600101613c84565b505f805b6008811015613d3557613cee8160076159ec565b613cf9906008615963565b6001600160401b031688613d0e83602661592e565b81518110613d1e57613d1e61572b565b016020015160f81c901b9190911790600101613cda565b5090969095509350505050565b5f80516020615f438339815191525f6001600160401b038084169085161115613d7657613d6f8385615596565b9050613d83565b613d808484615596565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de5575060028401548151613de1916001600160401b03169061592e565b8210155b15613e0b576001600160401b038316606082015281815260408101516020820152613e2a565b8281606001818151613e1d91906159cc565b6001600160401b03169052505b6060810151613e3a906064615cb8565b602082015160028601546001600160401b039290921691613e659190600160401b900460ff16615963565b1015613ec95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ee4919061592e565b9052506040810180516001600160401b0387169190613f049083906159ec565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f838339815191526020526040812060020180545f80516020615f4383398151915291600160401b9091046001600160401b0316906008613f9a83615d2e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402957604051631afcd79f60e31b815260040160405180910390fd5b565b614033613fe0565b61403c8161472a565b614044614743565b61409f608082013560a083013561406160e0850160c08601615409565b614072610100860160e08701615d49565b61ffff1661408861012087016101008801615d62565b61409a610140880161012089016156cb565b614753565b50565b6140aa613fe0565b5f80516020615ee38339815191526001600160a01b0382166141235760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614997565b5f610a59825f80516020615ee3833981519152546001600160a01b0316906149f8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f438339815191524261426f6040860160208701615409565b6001600160401b0316116142e15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142f16040850160208601615409565b6001600160401b03166143076202a3004261592e565b1161437a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156144015760405162461bcd60e51b815260040161054290615886565b60306144106040860186615d82565b9050146144755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61447f835f613d42565b5f806145196040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c49190615409565b6001600160401b031681526020016144df60408a018a615d82565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5a565b5f828152600786016020526040902091935091506145378282615e08565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145649085906004016155ef565b6020604051808303815f875af1158015614580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a491906155b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461c5761461c615442565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fc918e01908e01615409565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614732613fe0565b61473a614f09565b61409f81614f11565b61474b613fe0565b6140296150b3565b61475b613fe0565b5f80516020615f03833981519152836147c75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147e95760405162461bcd60e51b815260040161054290615ce3565b858711156148515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148be5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149305760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ab6001600160a01b038416836150bb565b905080515f141580156149cf5750808060200190518101906149cd9190615ec7565b155b15611ffa57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6291906155b6565b9050614a796001600160a01b0385163330866150c8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae191906155b6565b9050818111614b475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b5182826159ec565b95945050505050565b5f6060826080015151603014614bc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3b57614bfb8160016159ec565b614c06906008615963565b5081515f90839083908110614c1d57614c1d61572b565b60200101906001600160f81b03191690815f1a905350600101614be7565b505f5b6004811015614ca357614c528160036159ec565b614c5d906008615963565b600160ff919091161c60f81b82614c7583600261592e565b81518110614c8557614c8561572b565b60200101906001600160f81b03191690815f1a905350600101614c3e565b505f5b6020811015614d005784518160208110614cc257614cc261572b565b1a60f81b82614cd283600661592e565b81518110614ce257614ce261572b565b60200101906001600160f81b03191690815f1a905350600101614ca6565b505f5b6020811015614d605784602001518160208110614d2257614d2261572b565b1a60f81b82614d3283602661592e565b81518110614d4257614d4261572b565b60200101906001600160f81b03191690815f1a905350600101614d03565b505f5b6008811015614dd457614d778160076159ec565b614d82906008615963565b60ff1685604001516001600160401b0316901c60f81b82826046614da6919061592e565b81518110614db657614db661572b565b60200101906001600160f81b03191690815f1a905350600101614d63565b505f5b6030811015614e3f5784608001518181518110614df657614df661572b565b01602001516001600160f81b03191682614e1183604e61592e565b81518110614e2157614e2161572b565b60200101906001600160f81b03191690815f1a905350600101614dd7565b505f5b6008811015614eb157614e568160076159ec565b614e61906008615963565b60608601516001600160401b0390811691161c60f81b82614e8383607e61592e565b81518110614e9357614e9361572b565b60200101906001600160f81b03191690815f1a905350600101614e42565b50600281604051614ec2919061591d565b602060405180830381855afa158015614edd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0091906155b6565b94909350915050565b614029613fe0565b614f19613fe0565b80355f80516020615f4383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f656080840160608501615d62565b60ff161115614fd25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fe36080840160608501615d62565b60ff161161504b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61505b6080830160608401615d62565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508c6060830160408401615409565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613387613fe0565b606061270f83835f615101565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614170565b6060814710156151265760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b03168486604051615141919061591d565b5f6040518083038185875af1925050503d805f811461517b576040519150601f19603f3d011682016040523d82523d5f602084013e615180565b606091505b509150915061238e8683836060826151a05761519b826151e7565b61270f565b81511580156151b757506001600160a01b0384163b155b156151e057604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b508061270f565b8051156151f75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521c906159ff565b5f825580601f1061522b575050565b601f0160209004905f5260205f209081019061409f9190615283565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615297575f8155600101615284565b5090565b801515811461409f575f80fd5b803563ffffffff811681146152bb575f80fd5b919050565b5f805f606084860312156152d2575f80fd5b8335925060208401356152e48161529b565b91506152f2604085016152a8565b90509250925092565b5f6020828403121561530b575f80fd5b5035919050565b6001600160a01b038116811461409f575f80fd5b5f80828403610160811215615339575f80fd5b61014080821215615348575f80fd5b849350830135905061535981615312565b809150509250929050565b5f60208284031215615374575f80fd5b61270f826152a8565b5f806040838503121561538e575f80fd5b615397836152a8565b946020939093013593505050565b5f80604083850312156153b6575f80fd5b82356001600160401b038111156153cb575f80fd5b8301608081860312156153dc575f80fd5b91506153ea602084016152a8565b90509250929050565b80356001600160401b03811681146152bb575f80fd5b5f60208284031215615419575f80fd5b61270f826153f3565b5f8060408385031215615433575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b460608401826001600160401b03169052565b5060808301516154cf60808401826001600160401b03169052565b5060a08301516154ea60a08401826001600160401b03169052565b5060c083015161550560c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bb575f80fd5b5f805f8060808587031215615530575f80fd5b84356001600160401b03811115615545575f80fd5b850160608188031215615556575f80fd5b93506155646020860161550c565b9250615572604086016153f3565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550557615505615582565b5f602082840312156155c6575f80fd5b5051919050565b5f5b838110156155e75781810151838201526020016155cf565b50505f910152565b602081525f825180602084015261560d8160408501602087016155cd565b601f01601f19169190910160400192915050565b5f8261563b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156db575f80fd5b813561270f81615312565b5f808335601e198436030181126156fb575f80fd5b8301803591506001600160401b03821115615714575f80fd5b6020019150600581901b36038213156124e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615753575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157935761579361575d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c1576157c161575d565b604052919050565b5f6001600160401b038211156157e1576157e161575d565b50601f01601f191660200190565b5f606082360312156157ff575f80fd5b615807615771565b8235815260206158188185016153f3565b8183015260408401356001600160401b03811115615834575f80fd5b840136601f820112615844575f80fd5b8035615857615852826157c9565b615799565b818152368483850101111561586a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158df818460208a016155cd565b80830190508581526001600160401b0360c01b8560c01b166020820152835161590f8160288401602088016155cd565b016028019695505050505050565b5f82516157538184602087016155cd565b80820180821115610a5957610a59615582565b5f63ffffffff80831681810361595957615959615582565b6001019392505050565b8082028115828204841417610a5957610a59615582565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561550557615505615582565b81810381811115610a5957610a59615582565b600181811c90821680615a1357607f821691505b602082108103615a3157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a90816159ff565b806020870152604060018084165f8114615ab15760018114615acd57615afa565b60ff19851660408a0152604084151560051b8a01019550615afa565b895f5260205f205f5b85811015615af15781548b8201860152908301908801615ad6565b8a016040019650505b509398975050505050505050565b80516152bb8161529b565b5f8060408385031215615b24575f80fd5b82516001600160401b0380821115615b3a575f80fd5b9084019060608287031215615b4d575f80fd5b615b55615771565b82518152602080840151615b6881615312565b82820152604084015183811115615b7d575f80fd5b80850194505087601f850112615b91575f80fd5b83519250615ba1615852846157c9565b8381528882858701011115615bb4575f80fd5b615bc3848383018488016155cd565b80604084015250819550615bd8818801615b08565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cdb57615cdb615582565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595957615959615582565b5f60208284031215615d59575f80fd5b61270f8261550c565b5f60208284031215615d72575f80fd5b813560ff8116811461270f575f80fd5b5f808335601e19843603018112615d97575f80fd5b8301803591506001600160401b03821115615db0575f80fd5b6020019150368190038213156124e8575f80fd5b601f821115611ffa57805f5260205f20601f840160051c81016020851015615de95750805b601f840160051c820191505b81811015610bd7575f8155600101615df5565b81516001600160401b03811115615e2157615e2161575d565b615e3581615e2f84546159ff565b84615dc4565b602080601f831160018114615e68575f8415615e515750858301515b5f19600386901b1c1916600185901b178555615ebf565b5f85815260208120601f198616915b82811015615e9657888601518255948401946001909101908401615e77565b5085821015615eb357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ed7575f80fd5b815161270f8161529b56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -626,6 +626,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + // CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // // Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() @@ -971,12 +992,14 @@ type ERC20TokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte Nonce uint64 + Rewards *big.Int + Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} @@ -999,9 +1022,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1049,9 +1072,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go new file mode 100644 index 000000000..d343cda87 --- /dev/null +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -0,0 +1,327 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package examplerewardcalculator + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. +var ExampleRewardCalculatorMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b50604051610357380380610357833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102d36100845f395f8181609e015261013a01526102d35ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80635dcc93911461004e578063778c06b51461006c578063afba878a1461007f578063bb65b24214610099575b5f80fd5b6100596301e1338081565b6040519081526020015b60405180910390f35b61005961007a3660046101b6565b6100d9565b610087605081565b60405160ff9091168152602001610063565b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610063565b5f60506100e68887610236565b6100f0919061025e565b67ffffffffffffffff1661010585606461025e565b67ffffffffffffffff16101561011c57505f61018f565b6127106301e1338061012e8888610236565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61016e919061028a565b610178919061028a565b61018291906102a7565b61018c91906102a7565b90505b979650505050505050565b803567ffffffffffffffff811681146101b1575f80fd5b919050565b5f805f805f805f60e0888a0312156101cc575f80fd5b873596506101dc6020890161019a565b95506101ea6040890161019a565b94506101f86060890161019a565b93506102066080890161019a565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561025757610257610222565b5092915050565b67ffffffffffffffff81811683821602808216919082811461028257610282610222565b505092915050565b80820281158282048414176102a1576102a1610222565b92915050565b5f826102c157634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", +} + +// ExampleRewardCalculatorABI is the input ABI used to generate the binding from. +// Deprecated: Use ExampleRewardCalculatorMetaData.ABI instead. +var ExampleRewardCalculatorABI = ExampleRewardCalculatorMetaData.ABI + +// ExampleRewardCalculatorBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ExampleRewardCalculatorMetaData.Bin instead. +var ExampleRewardCalculatorBin = ExampleRewardCalculatorMetaData.Bin + +// DeployExampleRewardCalculator deploys a new Ethereum contract, binding an instance of ExampleRewardCalculator to it. +func DeployExampleRewardCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, rewardBasisPoints_ uint64) (common.Address, *types.Transaction, *ExampleRewardCalculator, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ExampleRewardCalculatorBin), backend, rewardBasisPoints_) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// ExampleRewardCalculator is an auto generated Go binding around an Ethereum contract. +type ExampleRewardCalculator struct { + ExampleRewardCalculatorCaller // Read-only binding to the contract + ExampleRewardCalculatorTransactor // Write-only binding to the contract + ExampleRewardCalculatorFilterer // Log filterer for contract events +} + +// ExampleRewardCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ExampleRewardCalculatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ExampleRewardCalculatorSession struct { + Contract *ExampleRewardCalculator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ExampleRewardCalculatorCallerSession struct { + Contract *ExampleRewardCalculatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ExampleRewardCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ExampleRewardCalculatorTransactorSession struct { + Contract *ExampleRewardCalculatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type ExampleRewardCalculatorRaw struct { + Contract *ExampleRewardCalculator // Generic contract binding to access the raw methods on +} + +// ExampleRewardCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCallerRaw struct { + Contract *ExampleRewardCalculatorCaller // Generic read-only contract binding to access the raw methods on +} + +// ExampleRewardCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactorRaw struct { + Contract *ExampleRewardCalculatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewExampleRewardCalculator creates a new instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculator(address common.Address, backend bind.ContractBackend) (*ExampleRewardCalculator, error) { + contract, err := bindExampleRewardCalculator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// NewExampleRewardCalculatorCaller creates a new read-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ExampleRewardCalculatorCaller, error) { + contract, err := bindExampleRewardCalculator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorCaller{contract: contract}, nil +} + +// NewExampleRewardCalculatorTransactor creates a new write-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ExampleRewardCalculatorTransactor, error) { + contract, err := bindExampleRewardCalculator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorTransactor{contract: contract}, nil +} + +// NewExampleRewardCalculatorFilterer creates a new log filterer instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ExampleRewardCalculatorFilterer, error) { + contract, err := bindExampleRewardCalculator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorFilterer{contract: contract}, nil +} + +// bindExampleRewardCalculator binds a generic wrapper to an already deployed contract. +func bindExampleRewardCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) SECONDSINYEAR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "SECONDS_IN_YEAR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) RewardBasisPoints(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "rewardBasisPoints") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 3cae87b6d..731fe5258 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,8 +83,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516157ff3803806157ff83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6156b28061014d5f395ff3fe608060405260043610610161575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461045e578063c974d1b614610471578063d5f20ff614610485578063df93d8de146104b1575f80fd5b8063b771b3bc146103ee578063ba3a4b9714610420578063bee0a03f1461043f575f80fd5b8063620658561461033f57806366435abf1461035e57806376f786211461037d5780638280a25a1461039c57806398f3e2b4146103b0578063a3a65e48146103cf575f80fd5b806335455ded1161011e57806335455ded1461027e57806340034a93146102a6578063467ef06f146102b95780635297fae6146102d857806360305d62146102f757806361e2f49014610320575f80fd5b80630118acc4146101655780630322ed98146101865780630cdd0985146101a5578063151d30d1146102025780631f7a9d8f146102285780632e2194d814610247575b5f80fd5b348015610170575f80fd5b5061018461017f366004614aae565b6104c7565b005b348015610191575f80fd5b506101846101a0366004614ae9565b61087c565b3480156101b0575f80fd5b506101ef6101bf366004614ae9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b50610216600a81565b60405160ff90911681526020016101f9565b348015610233575f80fd5b50610184610242366004614b00565b610a35565b348015610252575f80fd5b50610266610261366004614ae9565b610b12565b6040516001600160401b0390911681526020016101f9565b348015610289575f80fd5b5061029361271081565b60405161ffff90911681526020016101f9565b6101ef6102b4366004614b3e565b610b28565b3480156102c4575f80fd5b506101846102d3366004614b92565b610b5c565b3480156102e3575f80fd5b506101846102f2366004614bab565b610baf565b348015610302575f80fd5b5061030b601481565b60405163ffffffff90911681526020016101f9565b34801561032b575f80fd5b5061018461033a366004614bd3565b610d84565b34801561034a575f80fd5b506101ef610359366004614c21565b6113b8565b348015610369575f80fd5b50610266610378366004614ae9565b6113d1565b348015610388575f80fd5b50610184610397366004614aae565b6113e5565b3480156103a7575f80fd5b50610216603081565b3480156103bb575f80fd5b506101846103ca366004614bab565b6114c6565b3480156103da575f80fd5b506101846103e9366004614b92565b6116f3565b3480156103f9575f80fd5b506104086005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b34801561042b575f80fd5b5061018461043a366004614ae9565b6118ab565b34801561044a575f80fd5b50610184610459366004614ae9565b611b31565b6101ef61046c366004614ae9565b611c45565b34801561047c575f80fd5b50610216601481565b348015610490575f80fd5b506104a461049f366004614ae9565b611c76565b6040516101f99190614c4e565b3480156104bc575f80fd5b506102666202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615606833981519152918415610519576105168285611d69565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561054b5761054b614c3a565b600481111561055c5761055c614c3a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105d884611c76565b90506002825160048111156105ef576105ef614c3a565b146106415760405162461bcd60e51b815260206004820152602a60248201525f805160206156268339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106a65760405162461bcd60e51b815260206004820152603360248201525f805160206156268339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610638565b60038252805160029060058111156106c0576106c0614c3a565b03610704575f826060015182608001516106da9190614d18565b90506106e68582612005565b506001600160401b0390811660e0850152421660a084015250610725565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561075657610756614c3a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161086a916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206156868339815191526020526040808220815160e0810190925280545f8051602061564683398151915293929190829060ff1660058111156108c9576108c9614c3a565b60058111156108da576108da614c3a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561094957610949614c3a565b146109ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610638565b6005600160991b016001600160a01b031663ee5b48eb6109d38584606001515f61215c565b6040518263ffffffff1660e01b81526004016109ef9190614d5a565b6020604051808303815f875af1158015610a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614d8c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7e575080546001600160401b03808416911610155b15610a9c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac683612381565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b2264e8d4a5100083614da3565b92915050565b5f610b31612395565b610b3d848484346123cc565b9050610b5560015f8051602061566683398151915255565b9392505050565b5f805160206156068339815191525f80610b7584612649565b6040808201515f848152600588016020529190912054929450909250610a2f916001600160401b03909116906001600160a01b03166129c1565b5f805160206156068339815191525f610bc7846129d4565b90505f80610bd88360400151612bae565b50915091505f610be783611c76565b9050816001600160401b031681606001516001600160401b03161015610c1f5760405162461bcd60e51b815260040161063890614dc2565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c645760405162461bcd60e51b815260040161063890614e04565b60015f87815260068701602052604090205460ff166004811115610c8a57610c8a614c3a565b14610cf35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610638565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206156468339815191529060ff1615610e215760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610638565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e889190614d8c565b836020013514610eea5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610638565b30610efb6060850160408601614e61565b6001600160a01b031614610f6d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610638565b5f610f7b6060850185614e7c565b91505f9050843560208601356014610f996060890160408a01614e61565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c8575f6110196060890189614e7c565b8363ffffffff1681811061102f5761102f614ec1565b90506020028101906110419190614ed5565b61104a90614f85565b80515f818152600989016020526040902054919250901561107d5760405162461bcd60e51b81526004016106389061501c565b84825f01518360200151846040015160405160200161109f9493929190615064565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ed91906150b3565b602060405180830381855afa158015611108573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112b9190614d8c565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b7576111b7614c3a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126a9116866150c4565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c1906150d7565b9050610ffd565b50600584018190555f6112da866129d4565b90505f6112ea8260400151612de9565b9050806002856040516112fd91906150b3565b602060405180830381855afa158015611318573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133b9190614d8c565b1461139f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610638565b505050600a909201805460ff1916600117905550505050565b5f610b226001600160401b03831664e8d4a510006150f9565b5f6113db82611c76565b6080015192915050565b5f805160206156068339815191525f6113fd85611c76565b5f86815260058401602052604090205460a082015191925061143091600160b01b9091046001600160401b031690615110565b6001600160401b03164210156114a45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610638565b83156114b6576114b48584611d69565b505b6114bf85612f52565b5050505050565b6114ce612395565b5f805160206156068339815191525f6114e6846129d4565b90505f806114f78360400151612bae565b50915091505f61150683611c76565b9050816001600160401b031681606001516001600160401b0316101561153e5760405162461bcd60e51b815260040161063890614dc2565b5f8681526006860160205260409020600301546001600160401b038084169116111561157c5760405162461bcd60e51b815260040161063890614e04565b60035f87815260068701602052604090205460ff1660048111156115a2576115a2614c3a565b146115f65760405162461bcd60e51b815260206004820152603160248201525f805160206156268339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610638565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261169b916129c1565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116ef60015f8051602061566683398151915255565b5050565b5f805160206156468339815191525f61170b836129d4565b90505f8061171c83604001516131c3565b915091508061177e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610638565b5f8281526007850160205260408120805461179890615130565b90501180156117ca575060015f83815260088601602052604090205460ff1660058111156117c8576117c8614c3a565b145b6117e65760405162461bcd60e51b815260040161063890615162565b5f82815260078501602052604081206117fe91614a44565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061560683398151915293929190829060ff16600481111561190c5761190c614c3a565b600481111561191d5761191d614c3a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119a4576119a4614c3a565b14806119c257506003815160048111156119c0576119c0614c3a565b145b611a165760405162461bcd60e51b815260206004820152603260248201525f80516020615626833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610638565b5f611a248260400151611c76565b905080606001516001600160401b03165f03611aa85760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610638565b6005600160991b016001600160a01b031663ee5b48eb611ad584604001518460600151856080015161215c565b6040518263ffffffff1660e01b8152600401611af19190614d5a565b6020604051808303815f875af1158015611b0d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114bf9190614d8c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615646833981519152929190611b7990615130565b9050118015611bab575060015f83815260088301602052604090205460ff166005811115611ba957611ba9614c3a565b145b611bc75760405162461bcd60e51b815260040161063890615162565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c0091906004016151a9565b6020604051808303815f875af1158015611c1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c409190614d8c565b505050565b5f611c4e612395565b611c59823334613364565b9050611c7160015f8051602061566683398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061568683398151915290528390208351918201909352825491925f8051602061564683398151915292829060ff166005811115611cf657611cf6614c3a565b6005811115611d0757611d07614c3a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611db4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ddb919081019061523e565b9150915080611e3e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610638565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea59190614d8c565b825114611f095760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610638565b60208201516001600160a01b031615611f7f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610638565b5f80611f8e8460400151613749565b91509150818714611ffb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610638565b9695505050505050565b5f8281525f80516020615686833981519152602052604081206002015481905f8051602061564683398151915290600160801b90046001600160401b031661204d8582613921565b5f61205787613b2f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120a78a858b61215c565b6040518263ffffffff1660e01b81526004016120c39190614d5a565b6020604051808303815f875af11580156120df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121039190614d8c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121d557612195816001615310565b6121a09060086150f9565b5081515f908390839081106121b7576121b7614ec1565b60200101906001600160f81b03191690815f1a905350600101612181565b505f5b6004811015612240576121ec816003615310565b6121f79060086150f9565b600263ffffffff16901c60f81b8282600261221291906150c4565b8151811061222257612222614ec1565b60200101906001600160f81b03191690815f1a9053506001016121d8565b505f5b60208110156122a25761225781601f615310565b6122629060086150f9565b86901c60f81b826122748360066150c4565b8151811061228457612284614ec1565b60200101906001600160f81b03191690815f1a905350600101612243565b505f5b600881101561230d576122b9816007615310565b6122c49060086150f9565b6001600160401b038616901c60f81b826122df8360266150c4565b815181106122ef576122ef614ec1565b60200101906001600160f81b03191690815f1a9053506001016122a5565b505f5b600881101561237857612324816007615310565b61232f9060086150f9565b6001600160401b038516901c60f81b8261234a83602e6150c4565b8151811061235a5761235a614ec1565b60200101906001600160f81b03191690815f1a905350600101612310565b50949350505050565b612389613bbf565b61239281613c0a565b50565b5f805160206156668339815191528054600119016123c657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206156068339815191529061ffff861610801590612418575061271061ffff861611155b6124345760405162461bcd60e51b815260040161063890615323565b60028101546001600160401b0390811690851610156124ad5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610638565b80548310156125105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610638565b80600101548311156125775760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610638565b825f61258282610b12565b90505f61258f8983613c7e565b905060405180606001604052806125a33390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061566683398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206156468339815191525f612698856129d4565b90505f806126a983604001516131c3565b91509150801561270e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610638565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561273f5761273f614c3a565b600581111561275057612750614c3a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127c1576127c1614c3a565b14806127df57506001825160058111156127dd576127dd614c3a565b145b61283e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610638565b60038251600581111561285357612853614c3a565b0361286057506004612864565b5060055b6020808301515f9081526009880190915260408120558181600581111561288d5761288d614c3a565b908160058111156128a0576128a0614c3a565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156128d4576128d4614c3a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561298857612988614c3a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116ef6001600160a01b038216836141e3565b60408051606080820183525f8083526020830181905292820152905f805160206156468339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a49573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a70919081019061523e565b9150915080612ad05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610638565b8254825114612b335760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610638565b60208201516001600160a01b031615612ba65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610638565b509392505050565b5f805f8351603614612bd25760405162461bcd60e51b81526004016106389061536e565b5f805b6002811015612c2157612be9816001615310565b612bf49060086150f9565b61ffff16868281518110612c0a57612c0a614ec1565b016020015160f81c901b9190911790600101612bd5565b5061ffff811615612c445760405162461bcd60e51b8152600401610638906153b7565b5f805b6004811015612c9f57612c5b816003615310565b612c669060086150f9565b63ffffffff1687612c788360026150c4565b81518110612c8857612c88614ec1565b016020015160f81c901b9190911790600101612c47565b5063ffffffff8116600414612cc65760405162461bcd60e51b8152600401610638906153fa565b5f805b6020811015612d1b57612cdd81601f615310565b612ce89060086150f9565b88612cf48360066150c4565b81518110612d0457612d04614ec1565b016020015160f81c901b9190911790600101612cc9565b505f805b6008811015612d7a57612d33816007615310565b612d3e9060086150f9565b6001600160401b031689612d538360266150c4565b81518110612d6357612d63614ec1565b016020015160f81c901b9190911790600101612d1f565b505f805b6008811015612dd957612d92816007615310565b612d9d9060086150f9565b6001600160401b03168a612db283602e6150c4565b81518110612dc257612dc2614ec1565b016020015160f81c901b9190911790600101612d7e565b5091989097509095509350505050565b5f8151602614612e0b5760405162461bcd60e51b81526004016106389061536e565b5f805b6002811015612e5a57612e22816001615310565b612e2d9060086150f9565b61ffff16848281518110612e4357612e43614ec1565b016020015160f81c901b9190911790600101612e0e565b5061ffff811615612e7d5760405162461bcd60e51b8152600401610638906153b7565b5f805b6004811015612ed857612e94816003615310565b612e9f9060086150f9565b63ffffffff1685612eb18360026150c4565b81518110612ec157612ec1614ec1565b016020015160f81c901b9190911790600101612e80565b5063ffffffff811615612efd5760405162461bcd60e51b8152600401610638906153fa565b5f805b602081101561237857612f1481601f615310565b612f1f9060086150f9565b86612f2b8360066150c4565b81518110612f3b57612f3b614ec1565b016020015160f81c901b9190911790600101612f00565b5f8181525f805160206156868339815191526020526040808220815160e0810190925280545f8051602061564683398151915293929190829060ff166005811115612f9f57612f9f614c3a565b6005811115612fb057612fb0614c3a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561302257613022614c3a565b1461307e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610638565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156130c2576130c2614c3a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61316e8482612005565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146131e65760405162461bcd60e51b81526004016106389061536e565b5f805b6002811015613235576131fd816001615310565b6132089060086150f9565b61ffff1685828151811061321e5761321e614ec1565b016020015160f81c901b91909117906001016131e9565b5061ffff8116156132585760405162461bcd60e51b8152600401610638906153b7565b5f805b60048110156132b35761326f816003615310565b61327a9060086150f9565b63ffffffff168661328c8360026150c4565b8151811061329c5761329c614ec1565b016020015160f81c901b919091179060010161325b565b5063ffffffff81166003146132da5760405162461bcd60e51b8152600401610638906153fa565b5f805b602081101561332f576132f181601f615310565b6132fc9060086150f9565b876133088360066150c4565b8151811061331857613318614ec1565b016020015160f81c901b91909117906001016132dd565b505f8660268151811061334457613344614ec1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206156068339815191528161337d84610b12565b90505f61338987611c76565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b031661341f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610638565b60028151600581111561343457613434614c3a565b146134935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610638565b5f8282608001516134a49190615110565b600485015460408401519192506134c6916001600160401b0390911690615441565b6001600160401b0316816001600160401b031611156135455760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610638565b5f806135518a84612005565b915091505f8a8360405160200161357f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561361a5761361a614c3a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461376c5760405162461bcd60e51b81526004016106389061536e565b5f805b60028110156137bb57613783816001615310565b61378e9060086150f9565b61ffff168582815181106137a4576137a4614ec1565b016020015160f81c901b919091179060010161376f565b5061ffff8116156137de5760405162461bcd60e51b8152600401610638906153b7565b5f805b6004811015613839576137f5816003615310565b6138009060086150f9565b63ffffffff16866138128360026150c4565b8151811061382257613822614ec1565b016020015160f81c901b91909117906001016137e1565b5063ffffffff81166005146138605760405162461bcd60e51b8152600401610638906153fa565b5f805b60208110156138b55761387781601f615310565b6138829060086150f9565b8761388e8360066150c4565b8151811061389e5761389e614ec1565b016020015160f81c901b9190911790600101613863565b505f805b6008811015613914576138cd816007615310565b6138d89060086150f9565b6001600160401b0316886138ed8360266150c4565b815181106138fd576138fd614ec1565b016020015160f81c901b91909117906001016138b9565b5090969095509350505050565b5f805160206156468339815191525f6001600160401b0380841690851611156139555761394e8385614d18565b9050613962565b61395f8484614d18565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806139c45750600284015481516139c0916001600160401b0316906150c4565b8210155b156139ea576001600160401b038316606082015281815260408101516020820152613a09565b82816060018181516139fc9190615110565b6001600160401b03169052505b6060810151613a19906064615441565b602082015160028601546001600160401b039290921691613a449190600160401b900460ff166150f9565b1015613aa85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610638565b856001600160401b031681604001818151613ac391906150c4565b9052506040810180516001600160401b0387169190613ae3908390615310565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156868339815191526020526040812060020180545f8051602061564683398151915291600160401b9091046001600160401b0316906008613b798361546c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c0857604051631afcd79f60e31b815260040160405180910390fd5b565b613c12613bbf565b613c1b81614276565b613c2361428f565b612392608082013560a0830135613c4060e0850160c08601614c21565b613c51610100860160e08701615487565b61ffff16613c67610120870161010088016154a0565b613c7961014088016101208901614e61565b61429f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613d095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610638565b5f8051602061564683398151915242613d286040860160208701614c21565b6001600160401b031611613d9a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610638565b613daa6040850160208601614c21565b6001600160401b0316613dc06202a300426150c4565b11613e335760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610638565b8335613e8b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610638565b83355f90815260098201602052604090205415613eba5760405162461bcd60e51b81526004016106389061501c565b6030613ec960408601866154c0565b905014613f2e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610638565b613f38835f613921565b5f80613fd26040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f7d9190614c21565b6001600160401b03168152602001613f9860408a018a6154c0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506144e3565b5f82815260078601602052604090209193509150613ff08282615546565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061401d908590600401614d5a565b6020604051808303815f875af1158015614039573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061405d9190614d8c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156140d5576140d5614c3a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141b5918e01908e01614c21565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156142065760405163cd78605960e01b8152306004820152602401610638565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461424f576040519150601f19603f3d011682016040523d82523d5f602084013e614254565b606091505b5050905080611c4057604051630a12f52160e11b815260040160405180910390fd5b61427e613bbf565b614286614892565b6123928161489a565b614297613bbf565b613c08614a3c565b6142a7613bbf565b5f80516020615606833981519152836143135760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610638565b6127108411156143355760405162461bcd60e51b815260040161063890615323565b8587111561439d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610638565b5f8360ff161161440a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610638565b600a60ff8416111561447c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610638565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461454d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610638565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156145c457614584816001615310565b61458f9060086150f9565b5081515f908390839081106145a6576145a6614ec1565b60200101906001600160f81b03191690815f1a905350600101614570565b505f5b600481101561462c576145db816003615310565b6145e69060086150f9565b600160ff919091161c60f81b826145fe8360026150c4565b8151811061460e5761460e614ec1565b60200101906001600160f81b03191690815f1a9053506001016145c7565b505f5b6020811015614689578451816020811061464b5761464b614ec1565b1a60f81b8261465b8360066150c4565b8151811061466b5761466b614ec1565b60200101906001600160f81b03191690815f1a90535060010161462f565b505f5b60208110156146e957846020015181602081106146ab576146ab614ec1565b1a60f81b826146bb8360266150c4565b815181106146cb576146cb614ec1565b60200101906001600160f81b03191690815f1a90535060010161468c565b505f5b600881101561475d57614700816007615310565b61470b9060086150f9565b60ff1685604001516001600160401b0316901c60f81b8282604661472f91906150c4565b8151811061473f5761473f614ec1565b60200101906001600160f81b03191690815f1a9053506001016146ec565b505f5b60308110156147c8578460800151818151811061477f5761477f614ec1565b01602001516001600160f81b0319168261479a83604e6150c4565b815181106147aa576147aa614ec1565b60200101906001600160f81b03191690815f1a905350600101614760565b505f5b600881101561483a576147df816007615310565b6147ea9060086150f9565b60608601516001600160401b0390811691161c60f81b8261480c83607e6150c4565b8151811061481c5761481c614ec1565b60200101906001600160f81b03191690815f1a9053506001016147cb565b5060028160405161484b91906150b3565b602060405180830381855afa158015614866573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148899190614d8c565b94909350915050565b613c08613bbf565b6148a2613bbf565b80355f8051602061564683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146148ee60808401606085016154a0565b60ff16111561495b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610638565b5f61496c60808401606085016154a0565b60ff16116149d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610638565b6149e460808301606084016154a0565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614a156060830160408401614c21565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612636613bbf565b508054614a5090615130565b5f825580601f10614a5f575050565b601f0160209004905f5260205f209081019061239291905b80821115614a8a575f8155600101614a77565b5090565b8015158114612392575f80fd5b803563ffffffff81168114611c71575f80fd5b5f805f60608486031215614ac0575f80fd5b833592506020840135614ad281614a8e565b9150614ae060408501614a9b565b90509250925092565b5f60208284031215614af9575f80fd5b5035919050565b5f6101408284031215614b11575f80fd5b50919050565b803561ffff81168114611c71575f80fd5b80356001600160401b0381168114611c71575f80fd5b5f805f60608486031215614b50575f80fd5b83356001600160401b03811115614b65575f80fd5b840160608187031215614b76575f80fd5b9250614b8460208501614b17565b9150614ae060408501614b28565b5f60208284031215614ba2575f80fd5b610b5582614a9b565b5f8060408385031215614bbc575f80fd5b614bc583614a9b565b946020939093013593505050565b5f8060408385031215614be4575f80fd5b82356001600160401b03811115614bf9575f80fd5b830160808186031215614c0a575f80fd5b9150614c1860208401614a9b565b90509250929050565b5f60208284031215614c31575f80fd5b610b5582614b28565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614c7157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614cac60608401826001600160401b03169052565b506080830151614cc760808401826001600160401b03169052565b5060a0830151614ce260a08401826001600160401b03169052565b5060c0830151614cfd60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614cfd57614cfd614d04565b5f5b83811015614d52578181015183820152602001614d3a565b50505f910152565b602081525f8251806020840152614d78816040850160208701614d38565b601f01601f19169190910160400192915050565b5f60208284031215614d9c575f80fd5b5051919050565b5f82614dbd57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612392575f80fd5b5f60208284031215614e71575f80fd5b8135610b5581614e4d565b5f808335601e19843603018112614e91575f80fd5b8301803591506001600160401b03821115614eaa575f80fd5b6020019150600581901b3603821315612155575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ee9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f2957614f29614ef3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f5757614f57614ef3565b604052919050565b5f6001600160401b03821115614f7757614f77614ef3565b50601f01601f191660200190565b5f60608236031215614f95575f80fd5b614f9d614f07565b823581526020614fae818501614b28565b8183015260408401356001600160401b03811115614fca575f80fd5b840136601f820112614fda575f80fd5b8035614fed614fe882614f5f565b614f2f565b8181523684838501011115615000575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615075818460208a01614d38565b80830190508581526001600160401b0360c01b8560c01b16602082015283516150a5816028840160208801614d38565b016028019695505050505050565b5f8251614ee9818460208701614d38565b80820180821115610b2257610b22614d04565b5f63ffffffff8083168181036150ef576150ef614d04565b6001019392505050565b8082028115828204841417610b2257610b22614d04565b6001600160401b03818116838216019080821115614cfd57614cfd614d04565b600181811c9082168061514457607f821691505b602082108103614b1157634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546151bb81615130565b806020870152604060018084165f81146151dc57600181146151f857615225565b60ff19851660408a0152604084151560051b8a01019550615225565b895f5260205f205f5b8581101561521c5781548b8201860152908301908801615201565b8a016040019650505b509398975050505050505050565b8051611c7181614a8e565b5f806040838503121561524f575f80fd5b82516001600160401b0380821115615265575f80fd5b9084019060608287031215615278575f80fd5b615280614f07565b8251815260208084015161529381614e4d565b828201526040840151838111156152a8575f80fd5b80850194505087601f8501126152bc575f80fd5b835192506152cc614fe884614f5f565b83815288828587010111156152df575f80fd5b6152ee84838301848801614d38565b80604084015250819550615303818801615233565b9450505050509250929050565b81810381811115610b2257610b22614d04565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461546457615464614d04565b505092915050565b5f6001600160401b038083168181036150ef576150ef614d04565b5f60208284031215615497575f80fd5b610b5582614b17565b5f602082840312156154b0575f80fd5b813560ff81168114610b55575f80fd5b5f808335601e198436030181126154d5575f80fd5b8301803591506001600160401b038211156154ee575f80fd5b602001915036819003821315612155575f80fd5b601f821115611c4057805f5260205f20601f840160051c810160208510156155275750805b601f840160051c820191505b818110156114bf575f8155600101615533565b81516001600160401b0381111561555f5761555f614ef3565b6155738161556d8454615130565b84615502565b602080601f8311600181146155a6575f841561558f5750858301515b5f19600386901b1c1916600185901b1785556155fd565b5f85815260208120601f198616915b828110156155d4578886015182559484019460019091019084016155b5565b50858210156155f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615dba380380615dba83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c6d8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501b565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615056565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615056565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506d565b610b91565b348015610286575f80fd5b5061029a610295366004615056565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ab565b610c84565b34801561032a575f80fd5b506101b86103393660046150ff565b610cb8565b348015610349575f80fd5b506101b8610358366004615118565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615140565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461518e565b611561565b3480156103cf575f80fd5b5061029a6103de366004615056565b61157a565b3480156103ee575f80fd5b506101b86103fd36600461501b565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615056565b6117d1565b348015610440575f80fd5b506101b861044f366004615118565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150ff565b611bfb565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615056565b611db3565b3480156104b7575f80fd5b506101b86104c6366004615056565b612039565b6102236104d9366004615056565b61214d565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615056565b61217e565b60405161022d91906151bb565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115610595576105956151a7565b60048111156105a6576105a66151a7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261217e565b9050600283516004811115610641576106416151a7565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615be18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615be18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146151a7565b0361076b57861561072c576107298387612246565b90505b5f846060015183608001516107419190615285565b905061074d84826124e2565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906152a5565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26151a7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff166005811115610a2557610a256151a7565b6005811115610a3657610a366151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56151a7565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612639565b6040518263ffffffff1660e01b8152600401610b4b91906152de565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906152a5565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361285e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615310565b92915050565b5f610c8d612872565b610c99848484346128a9565b9050610cb160015f80516020615c2183398151915255565b9392505050565b5f80516020615bc18339815191525f80610cd184612b26565b91509150610cde82612e70565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166151a7565b03610d3b575f83815260088501602052604081208054919055610d398282612eab565b505b610d5181610d4c8460400151611561565b612f11565b5050505050565b5f80516020615bc18339815191525f610d7084612f24565b90505f80610d8183604001516130fe565b50915091505f610d908361217e565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061532f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615371565b60015f87815260068701602052604090205460ff166004811115610e3357610e336151a7565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c018339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906152a5565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ce565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153e9565b91505f90508435602086013560146111426060890160408a016153ce565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153e9565b8363ffffffff168181106111d8576111d861542e565b90506020028101906111ea9190615442565b6111f3906154f2565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615589565b84825f01518360200151846040015160405160200161124894939291906155d1565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615620565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906152a5565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611360576113606151a7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615631565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615644565b90506111a6565b50600584018190555f61148386612f24565b90505f6114938260400151613339565b9050806002856040516114a69190615620565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e491906152a5565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615666565b5f6115848261217e565b6080015192915050565b5f80516020615bc18339815191525f6115a6856134a2565b90506115b185612e70565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a9061567d565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156cf565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b48685612246565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a591906152a5565b5f878152600885016020526040812080549091906117c4908490615631565b9091555050505050505050565b5f80516020615bc18339815191525f6117e98361217e565b9050600481516005811115611800576118006151a7565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a9061567d565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612eab565b6118df612872565b5f80516020615bc18339815191525f6118f784612f24565b90505f8061190883604001516130fe565b50915091505f6119178361217e565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611951576119516151a7565b6004811115611962576119626151a7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a9061532f565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615371565b600381516004811115611a9157611a916151a7565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615be18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff1684615666565b611b309190615310565b905080886008015f8881526020019081526020015f205f828254611b549190615631565b909155505f9050611b6582846156ef565b9050611b75846020015182612eab565b611b8a8460200151610d4c8660600151611561565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bd0929190918252602082015260400190565b60405180910390a4505050505050505050611bf760015f80516020615c2183398151915255565b5050565b5f80516020615c018339815191525f611c1383612f24565b90505f80611c24836040015161371d565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611ca090615702565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151a7565b145b611cee5760405162461bcd60e51b815260040161068a90615734565b5f8281526007850160205260408120611d0691614f70565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115611e1457611e146151a7565b6004811115611e2557611e256151a7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151a7565b1480611eca5750600381516004811115611ec857611ec86151a7565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be1833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f2c826040015161217e565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fdd846040015184606001518560800151612639565b6040518263ffffffff1660e01b8152600401611ff991906152de565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906152a5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c0183398151915292919061208190615702565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151a7565b145b6120cf5760405162461bcd60e51b815260040161068a90615734565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161577b565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214891906152a5565b505050565b5f612156612872565b6121618233346138be565b905061217960015f80516020615c2183398151915255565b919050565b612186614fa7565b5f8281525f80516020615c41833981519152602052604090819020815160e0810190925280545f80516020615c01833981519152929190829060ff1660058111156121d3576121d36151a7565b60058111156121e4576121e46151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612291573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b89190810190615810565b915091508061231b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238291906152a5565b8251146123e65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561245c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061246b8460400151613c75565b915091508187146124d85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c41833981519152602052604081206002015481905f80516020615c0183398151915290600160801b90046001600160401b031661252a8582613e4d565b5f6125348761405b565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125848a858b612639565b6040518263ffffffff1660e01b81526004016125a091906152de565b6020604051808303815f875af11580156125bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e091906152a5565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b2576126728160016156ef565b61267d906008615666565b5081515f908390839081106126945761269461542e565b60200101906001600160f81b03191690815f1a90535060010161265e565b505f5b600481101561271d576126c98160036156ef565b6126d4906008615666565b600263ffffffff16901c60f81b828260026126ef9190615631565b815181106126ff576126ff61542e565b60200101906001600160f81b03191690815f1a9053506001016126b5565b505f5b602081101561277f5761273481601f6156ef565b61273f906008615666565b86901c60f81b82612751836006615631565b815181106127615761276161542e565b60200101906001600160f81b03191690815f1a905350600101612720565b505f5b60088110156127ea576127968160076156ef565b6127a1906008615666565b6001600160401b038616901c60f81b826127bc836026615631565b815181106127cc576127cc61542e565b60200101906001600160f81b03191690815f1a905350600101612782565b505f5b6008811015612855576128018160076156ef565b61280c906008615666565b6001600160401b038516901c60f81b8261282783602e615631565b815181106128375761283761542e565b60200101906001600160f81b03191690815f1a9053506001016127ed565b50949350505050565b6128666140eb565b61286f81614136565b50565b5f80516020615c218339815191528054600119016128a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc18339815191529061ffff8616108015906128f5575061271061ffff861611155b6129115760405162461bcd60e51b815260040161068a906158e2565b60028101546001600160401b03908116908516101561298a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a545760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a5f82610c6e565b90505f612a6c89836141aa565b90506040518060600160405280612a803390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2183398151915255565b5f612b2f614fa7565b5f80516020615c018339815191525f612b4785612f24565b90505f80612b58836040015161371d565b915091508015612bbd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bee57612bee6151a7565b6005811115612bff57612bff6151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7057612c706151a7565b1480612c8e5750600182516005811115612c8c57612c8c6151a7565b145b612ced5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612d0257612d026151a7565b03612d0f57506004612d13565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3c57612d3c6151a7565b90816005811115612d4f57612d4f6151a7565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8357612d836151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3757612e376151a7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef7575f80fd5b505af1158015612f09573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b0383168261470f565b60408051606080820183525f8083526020830181905292820152905f80516020615c018339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc09190810190615810565b91509150806130205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131225760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613171576131398160016156ef565b613144906008615666565b61ffff1686828151811061315a5761315a61542e565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b815260040161068a90615976565b5f805b60048110156131ef576131ab8160036156ef565b6131b6906008615666565b63ffffffff16876131c8836002615631565b815181106131d8576131d861542e565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b815260040161068a906159b9565b5f805b602081101561326b5761322d81601f6156ef565b613238906008615666565b88613244836006615631565b815181106132545761325461542e565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca576132838160076156ef565b61328e906008615666565b6001600160401b0316896132a3836026615631565b815181106132b3576132b361542e565b016020015160f81c901b919091179060010161326f565b505f805b6008811015613329576132e28160076156ef565b6132ed906008615666565b6001600160401b03168a61330283602e615631565b815181106133125761331261542e565b016020015160f81c901b91909117906001016132ce565b5091989097509095509350505050565b5f815160261461335b5760405162461bcd60e51b815260040161068a9061592d565b5f805b60028110156133aa576133728160016156ef565b61337d906008615666565b61ffff168482815181106133935761339361542e565b016020015160f81c901b919091179060010161335e565b5061ffff8116156133cd5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613428576133e48160036156ef565b6133ef906008615666565b63ffffffff1685613401836002615631565b815181106134115761341161542e565b016020015160f81c901b91909117906001016133d0565b5063ffffffff81161561344d5760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156128555761346481601f6156ef565b61346f906008615666565b8661347b836006615631565b8151811061348b5761348b61542e565b016020015160f81c901b9190911790600101613450565b6134aa614fa7565b5f8281525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff1660058111156134f7576134f76151a7565b6005811115613508576135086151a7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357a5761357a6151a7565b146135d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361a5761361a6151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c685826124e2565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137405760405162461bcd60e51b815260040161068a9061592d565b5f805b600281101561378f576137578160016156ef565b613762906008615666565b61ffff168582815181106137785761377861542e565b016020015160f81c901b9190911790600101613743565b5061ffff8116156137b25760405162461bcd60e51b815260040161068a90615976565b5f805b600481101561380d576137c98160036156ef565b6137d4906008615666565b63ffffffff16866137e6836002615631565b815181106137f6576137f661542e565b016020015160f81c901b91909117906001016137b5565b5063ffffffff81166003146138345760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156138895761384b81601f6156ef565b613856906008615666565b87613862836006615631565b815181106138725761387261542e565b016020015160f81c901b9190911790600101613837565b505f8660268151811061389e5761389e61542e565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc1833981519152816138d784610c6e565b90505f6138e38761217e565b90506138ee87612e70565b61394b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613960576139606151a7565b146139bf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139d091906156cf565b600485015460408401519192506139f2916001600160401b0390911690615a00565b6001600160401b0316816001600160401b03161115613a715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a7d8a846124e2565b915091505f8a83604051602001613aab92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4657613b466151a7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c985760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613ce757613caf8160016156ef565b613cba906008615666565b61ffff16858281518110613cd057613cd061542e565b016020015160f81c901b9190911790600101613c9b565b5061ffff811615613d0a5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613d6557613d218160036156ef565b613d2c906008615666565b63ffffffff1686613d3e836002615631565b81518110613d4e57613d4e61542e565b016020015160f81c901b9190911790600101613d0d565b5063ffffffff8116600514613d8c5760405162461bcd60e51b815260040161068a906159b9565b5f805b6020811015613de157613da381601f6156ef565b613dae906008615666565b87613dba836006615631565b81518110613dca57613dca61542e565b016020015160f81c901b9190911790600101613d8f565b505f805b6008811015613e4057613df98160076156ef565b613e04906008615666565b6001600160401b031688613e19836026615631565b81518110613e2957613e2961542e565b016020015160f81c901b9190911790600101613de5565b5090969095509350505050565b5f80516020615c018339815191525f6001600160401b038084169085161115613e8157613e7a8385615285565b9050613e8e565b613e8b8484615285565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef0575060028401548151613eec916001600160401b031690615631565b8210155b15613f16576001600160401b038316606082015281815260408101516020820152613f35565b8281606001818151613f2891906156cf565b6001600160401b03169052505b6060810151613f45906064615a00565b602082015160028601546001600160401b039290921691613f709190600160401b900460ff16615666565b1015613fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fef9190615631565b9052506040810180516001600160401b038716919061400f9083906156ef565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c418339815191526020526040812060020180545f80516020615c0183398151915291600160401b9091046001600160401b03169060086140a583615a2b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413457604051631afcd79f60e31b815260040160405180910390fd5b565b61413e6140eb565b614147816147a2565b61414f6147bb565b61286f608082013560a083013561416c60e0850160c0860161518e565b61417d610100860160e08701615a46565b61ffff1661419361012087016101008801615a5f565b6141a5610140880161012089016153ce565b6147cb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615c0183398151915242614254604086016020870161518e565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142d6604085016020860161518e565b6001600160401b03166142ec6202a30042615631565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b815260040161068a90615589565b60306143f56040860186615a7f565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614464835f613e4d565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a9919061518e565b6001600160401b031681526020016144c460408a018a615a7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a0f565b5f8281526007860160205260409020919350915061451c8282615b05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016152de565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458991906152a5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614601576146016151a7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e0161518e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147325760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477b576040519150601f19603f3d011682016040523d82523d5f602084013e614780565b606091505b505090508061214857604051630a12f52160e11b815260040160405180910390fd5b6147aa6140eb565b6147b2614dbe565b61286f81614dc6565b6147c36140eb565b614134614f68565b6147d36140eb565b5f80516020615bc18339815191528361483f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148615760405162461bcd60e51b815260040161068a906158e2565b858711156148c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af057614ab08160016156ef565b614abb906008615666565b5081515f90839083908110614ad257614ad261542e565b60200101906001600160f81b03191690815f1a905350600101614a9c565b505f5b6004811015614b5857614b078160036156ef565b614b12906008615666565b600160ff919091161c60f81b82614b2a836002615631565b81518110614b3a57614b3a61542e565b60200101906001600160f81b03191690815f1a905350600101614af3565b505f5b6020811015614bb55784518160208110614b7757614b7761542e565b1a60f81b82614b87836006615631565b81518110614b9757614b9761542e565b60200101906001600160f81b03191690815f1a905350600101614b5b565b505f5b6020811015614c155784602001518160208110614bd757614bd761542e565b1a60f81b82614be7836026615631565b81518110614bf757614bf761542e565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c8957614c2c8160076156ef565b614c37906008615666565b60ff1685604001516001600160401b0316901c60f81b82826046614c5b9190615631565b81518110614c6b57614c6b61542e565b60200101906001600160f81b03191690815f1a905350600101614c18565b505f5b6030811015614cf45784608001518181518110614cab57614cab61542e565b01602001516001600160f81b03191682614cc683604e615631565b81518110614cd657614cd661542e565b60200101906001600160f81b03191690815f1a905350600101614c8c565b505f5b6008811015614d6657614d0b8160076156ef565b614d16906008615666565b60608601516001600160401b0390811691161c60f81b82614d3883607e615631565b81518110614d4857614d4861542e565b60200101906001600160f81b03191690815f1a905350600101614cf7565b50600281604051614d779190615620565b602060405180830381855afa158015614d92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db591906152a5565b94909350915050565b6141346140eb565b614dce6140eb565b80355f80516020615c0183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1a6080840160608501615a5f565b60ff161115614e875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e986080840160608501615a5f565b60ff1611614f005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614f106080830160608401615a5f565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f41606083016040840161518e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b136140eb565b508054614f7c90615702565b5f825580601f10614f8b575050565b601f0160209004905f5260205f209081019061286f9190614fe3565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff7575f8155600101614fe4565b5090565b801515811461286f575f80fd5b803563ffffffff81168114612179575f80fd5b5f805f6060848603121561502d575f80fd5b83359250602084013561503f81614ffb565b915061504d60408501615008565b90509250925092565b5f60208284031215615066575f80fd5b5035919050565b5f610140828403121561507e575f80fd5b50919050565b803561ffff81168114612179575f80fd5b80356001600160401b0381168114612179575f80fd5b5f805f606084860312156150bd575f80fd5b83356001600160401b038111156150d2575f80fd5b8401606081870312156150e3575f80fd5b92506150f160208501615084565b915061504d60408501615095565b5f6020828403121561510f575f80fd5b610cb182615008565b5f8060408385031215615129575f80fd5b61513283615008565b946020939093013593505050565b5f8060408385031215615151575f80fd5b82356001600160401b03811115615166575f80fd5b830160808186031215615177575f80fd5b915061518560208401615008565b90509250929050565b5f6020828403121561519e575f80fd5b610cb182615095565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151de57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521960608401826001600160401b03169052565b50608083015161523460808401826001600160401b03169052565b5060a083015161524f60a08401826001600160401b03169052565b5060c083015161526a60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526a5761526a615271565b5f602082840312156152b5575f80fd5b5051919050565b5f5b838110156152d65781810151838201526020016152be565b50505f910152565b602081525f82518060208401526152fc8160408501602087016152bc565b601f01601f19169190910160400192915050565b5f8261532a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461286f575f80fd5b5f602082840312156153de575f80fd5b8135610cb1816153ba565b5f808335601e198436030181126153fe575f80fd5b8301803591506001600160401b03821115615417575f80fd5b6020019150600581901b3603821315612632575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615456575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549657615496615460565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c4615460565b604052919050565b5f6001600160401b038211156154e4576154e4615460565b50601f01601f191660200190565b5f60608236031215615502575f80fd5b61550a615474565b82358152602061551b818501615095565b8183015260408401356001600160401b03811115615537575f80fd5b840136601f820112615547575f80fd5b803561555a615555826154cc565b61549c565b818152368483850101111561556d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e2818460208a016152bc565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156128160288401602088016152bc565b016028019695505050505050565b5f82516154568184602087016152bc565b80820180821115610c7e57610c7e615271565b5f63ffffffff80831681810361565c5761565c615271565b6001019392505050565b8082028115828204841417610c7e57610c7e615271565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561526a5761526a615271565b81810381811115610c7e57610c7e615271565b600181811c9082168061571657607f821691505b60208210810361507e57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461578d81615702565b806020870152604060018084165f81146157ae57600181146157ca576157f7565b60ff19851660408a0152604084151560051b8a010195506157f7565b895f5260205f205f5b858110156157ee5781548b82018601529083019088016157d3565b8a016040019650505b509398975050505050505050565b805161217981614ffb565b5f8060408385031215615821575f80fd5b82516001600160401b0380821115615837575f80fd5b908401906060828703121561584a575f80fd5b615852615474565b82518152602080840151615865816153ba565b8282015260408401518381111561587a575f80fd5b80850194505087601f85011261588e575f80fd5b8351925061589e615555846154cc565b83815288828587010111156158b1575f80fd5b6158c0848383018488016152bc565b806040840152508195506158d5818801615805565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2357615a23615271565b505092915050565b5f6001600160401b0380831681810361565c5761565c615271565b5f60208284031215615a56575f80fd5b610cb182615084565b5f60208284031215615a6f575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a94575f80fd5b8301803591506001600160401b03821115615aad575f80fd5b602001915036819003821315612632575f80fd5b601f82111561214857805f5260205f20601f840160051c81016020851015615ae65750805b601f840160051c820191505b81811015610d51575f8155600101615af2565b81516001600160401b03811115615b1e57615b1e615460565b615b3281615b2c8454615702565b84615ac1565b602080601f831160018114615b65575f8415615b4e5750858301515b5f19600386901b1c1916600185901b178555612f09565b5f85815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -440,6 +440,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) @@ -626,6 +657,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) +} + // CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // // Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() @@ -971,12 +1023,14 @@ type NativeTokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte Nonce uint64 + Rewards *big.Int + Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} @@ -999,9 +1053,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1049,9 +1103,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 0ef614183..2dbe9c8fa 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,7 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161397338038061397383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138268061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612db8565b61030c565b005b610173610143366004612db8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612de7565b6104ca565b6101336101a7366004612e2a565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e60565b6105e6565b6101ef6101ea366004612db8565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612ec0565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612db8565b610c5d565b6101336102a1366004612de7565b610c71565b6102686005600160991b0181565b6101336102c2366004612db8565b610e29565b610217601481565b6102e26102dd366004612db8565b610f38565b60405161017d9190612f19565b6101ef6202a30081565b610133610307366004612fcf565b61102b565b5f8181525f805160206137fa8339815191526020526040808220815160e0810190925280545f805160206137da83398151915293929190829060ff16600581111561035957610359612f05565b600581111561036a5761036a612f05565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612f05565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f611065565b6040518263ffffffff1660e01b81526004016104849190613013565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613045565b50505050565b6104d38161128a565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611602565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137da8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613045565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fcf565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561305c565b91505f90508435602086013560146107fb6060890160408a01612fcf565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961305c565b8363ffffffff16818110610891576108916130a1565b90506020028101906108a391906130b5565b6108ac90613165565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131fc565b84825f0151836020015184604001516040516020016109019493929190613244565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613293565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613045565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612f05565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132b8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132cb565b905061085f565b50600584018190555f610b3c86611620565b90505f610b4c82604001516117fa565b905080600285604051610b5f9190613293565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613045565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f38565b6080015192915050565b610c36611963565b610c3f5f6119be565b565b5f610c4a611963565b610c548383611a2e565b90505b92915050565b610c65611963565b610c6e81611f93565b50565b5f805160206137da8339815191525f610c8983611620565b90505f80610c9a8360400151612204565b9150915080610cfc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d16906132ed565b9050118015610d48575060015f83815260088601602052604090205460ff166005811115610d4657610d46612f05565b145b610d645760405162461bcd60e51b815260040161043a9061331f565b5f8281526007850160205260408120610d7c91612d6e565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137da833981519152929190610e71906132ed565b9050118015610ea3575060015f83815260088301602052604090205460ff166005811115610ea157610ea1612f05565b145b610ebf5760405162461bcd60e51b815260040161043a9061331f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef89190600401613366565b6020604051808303815f875af1158015610f14573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613045565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206137fa83398151915290528390208351918201909352825491925f805160206137da83398151915292829060ff166005811115610fb857610fb8612f05565b6005811115610fc957610fc9612f05565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611033611963565b6001600160a01b03811661105c57604051631e4fbdf760e01b81525f600482015260240161043a565b610c6e816119be565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110de5761109e8160016133f0565b6110a9906008613403565b5081515f908390839081106110c0576110c06130a1565b60200101906001600160f81b03191690815f1a90535060010161108a565b505f5b6004811015611149576110f58160036133f0565b611100906008613403565b600263ffffffff16901c60f81b8282600261111b91906132b8565b8151811061112b5761112b6130a1565b60200101906001600160f81b03191690815f1a9053506001016110e1565b505f5b60208110156111ab5761116081601f6133f0565b61116b906008613403565b86901c60f81b8261117d8360066132b8565b8151811061118d5761118d6130a1565b60200101906001600160f81b03191690815f1a90535060010161114c565b505f5b6008811015611216576111c28160076133f0565b6111cd906008613403565b6001600160401b038616901c60f81b826111e88360266132b8565b815181106111f8576111f86130a1565b60200101906001600160f81b03191690815f1a9053506001016111ae565b505f5b60088110156112815761122d8160076133f0565b611238906008613403565b6001600160401b038516901c60f81b8261125383602e6132b8565b81518110611263576112636130a1565b60200101906001600160f81b03191690815f1a905350600101611219565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206137da8339815191525f6112d985611620565b90505f806112ea8360400151612204565b91509150801561134f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561138057611380612f05565b600581111561139157611391612f05565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561140257611402612f05565b1480611420575060018251600581111561141e5761141e612f05565b145b61147f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561149457611494612f05565b036114a1575060046114a5565b5060055b6020808301515f908152600988019091526040812055818160058111156114ce576114ce612f05565b908160058111156114e1576114e1612f05565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561151557611515612f05565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156115c9576115c9612f05565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61160a6123a5565b611613826123ee565b61161c81612407565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206137da8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611695573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116bc9190810190613429565b915091508061171c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b825482511461177f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117f25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f815160261461181c5760405162461bcd60e51b815260040161043a906134fb565b5f805b600281101561186b576118338160016133f0565b61183e906008613403565b61ffff16848281518110611854576118546130a1565b016020015160f81c901b919091179060010161181f565b5061ffff81161561188e5760405162461bcd60e51b815260040161043a90613544565b5f805b60048110156118e9576118a58160036133f0565b6118b0906008613403565b63ffffffff16856118c28360026132b8565b815181106118d2576118d26130a1565b016020015160f81c901b9190911790600101611891565b5063ffffffff81161561190e5760405162461bcd60e51b815260040161043a90613587565b5f805b60208110156112815761192581601f6133f0565b611930906008613403565b8661193c8360066132b8565b8151811061194c5761194c6130a1565b016020015160f81c901b9190911790600101611911565b336119957f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611ab95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137da83398151915242611ad860408601602087016135ce565b6001600160401b031611611b4a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b5a60408501602086016135ce565b6001600160401b0316611b706202a300426132b8565b11611be35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611c3b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c6a5760405162461bcd60e51b815260040161043a906131fc565b6030611c7960408601866135e7565b905014611cde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611ce8835f612418565b5f80611d826040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d2d91906135ce565b6001600160401b03168152602001611d4860408a018a6135e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612626565b5f82815260078601602052604090209193509150611da08282613674565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611dcd908590600401613013565b6020604051808303815f875af1158015611de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0d9190613045565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e8557611e85612f05565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f65918e01908e016135ce565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206137fa8339815191526020526040808220815160e0810190925280545f805160206137da83398151915293929190829060ff166005811115611fe057611fe0612f05565b6005811115611ff157611ff1612f05565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561206357612063612f05565b146120bf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561210357612103612f05565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121af84826129d5565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146122275760405162461bcd60e51b815260040161043a906134fb565b5f805b60028110156122765761223e8160016133f0565b612249906008613403565b61ffff1685828151811061225f5761225f6130a1565b016020015160f81c901b919091179060010161222a565b5061ffff8116156122995760405162461bcd60e51b815260040161043a90613544565b5f805b60048110156122f4576122b08160036133f0565b6122bb906008613403565b63ffffffff16866122cd8360026132b8565b815181106122dd576122dd6130a1565b016020015160f81c901b919091179060010161229c565b5063ffffffff811660031461231b5760405162461bcd60e51b815260040161043a90613587565b5f805b60208110156123705761233281601f6133f0565b61233d906008613403565b876123498360066132b8565b81518110612359576123596130a1565b016020015160f81c901b919091179060010161231e565b505f86602681518110612385576123856130a1565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123f66123a5565b6123fe612b2c565b610c6e81612b34565b61240f6123a5565b610c6e81612cd6565b5f805160206137da8339815191525f6001600160401b03808416908516111561244c576124458385613733565b9050612459565b6124568484613733565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806124bb5750600284015481516124b7916001600160401b0316906132b8565b8210155b156124e1576001600160401b038316606082015281815260408101516020820152612500565b82816060018181516124f39190613753565b6001600160401b03169052505b6060810151612510906064613773565b602082015160028601546001600160401b03929092169161253b9190600160401b900460ff16613403565b101561259f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b0316816040018181516125ba91906132b8565b9052506040810180516001600160401b03871691906125da9083906133f0565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612707576126c78160016133f0565b6126d2906008613403565b5081515f908390839081106126e9576126e96130a1565b60200101906001600160f81b03191690815f1a9053506001016126b3565b505f5b600481101561276f5761271e8160036133f0565b612729906008613403565b600160ff919091161c60f81b826127418360026132b8565b81518110612751576127516130a1565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60208110156127cc578451816020811061278e5761278e6130a1565b1a60f81b8261279e8360066132b8565b815181106127ae576127ae6130a1565b60200101906001600160f81b03191690815f1a905350600101612772565b505f5b602081101561282c57846020015181602081106127ee576127ee6130a1565b1a60f81b826127fe8360266132b8565b8151811061280e5761280e6130a1565b60200101906001600160f81b03191690815f1a9053506001016127cf565b505f5b60088110156128a0576128438160076133f0565b61284e906008613403565b60ff1685604001516001600160401b0316901c60f81b8282604661287291906132b8565b81518110612882576128826130a1565b60200101906001600160f81b03191690815f1a90535060010161282f565b505f5b603081101561290b57846080015181815181106128c2576128c26130a1565b01602001516001600160f81b031916826128dd83604e6132b8565b815181106128ed576128ed6130a1565b60200101906001600160f81b03191690815f1a9053506001016128a3565b505f5b600881101561297d576129228160076133f0565b61292d906008613403565b60608601516001600160401b0390811691161c60f81b8261294f83607e6132b8565b8151811061295f5761295f6130a1565b60200101906001600160f81b03191690815f1a90535060010161290e565b5060028160405161298e9190613293565b602060405180830381855afa1580156129a9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129cc9190613045565b94909350915050565b5f8281525f805160206137fa833981519152602052604081206002015481905f805160206137da83398151915290600160801b90046001600160401b0316612a1d8582612418565b5f612a2787612cde565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a778a858b611065565b6040518263ffffffff1660e01b8152600401612a939190613013565b6020604051808303815f875af1158015612aaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad39190613045565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f6123a5565b612b3c6123a5565b80355f805160206137da83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b88608084016060850161379e565b60ff161115612bf55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612c06608084016060850161379e565b60ff1611612c6e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c7e608083016060840161379e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612caf60608301604084016135ce565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6110336123a5565b5f8181525f805160206137fa8339815191526020526040812060020180545f805160206137da83398151915291600160401b9091046001600160401b0316906008612d28836137be565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d7a906132ed565b5f825580601f10612d89575050565b601f0160209004905f5260205f2090810190610c6e91905b80821115612db4575f8155600101612da1565b5090565b5f60208284031215612dc8575f80fd5b5035919050565b803563ffffffff81168114612de2575f80fd5b919050565b5f60208284031215612df7575f80fd5b610c5482612dcf565b5f60808284031215612e10575f80fd5b50919050565b6001600160a01b0381168114610c6e575f80fd5b5f8060a08385031215612e3b575f80fd5b612e458484612e00565b91506080830135612e5581612e16565b809150509250929050565b5f8060408385031215612e71575f80fd5b82356001600160401b03811115612e86575f80fd5b612e9285828601612e00565b925050612ea160208401612dcf565b90509250929050565b80356001600160401b0381168114612de2575f80fd5b5f8060408385031215612ed1575f80fd5b82356001600160401b03811115612ee6575f80fd5b830160608186031215612ef7575f80fd5b9150612ea160208401612eaa565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f3c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f7760608401826001600160401b03169052565b506080830151612f9260808401826001600160401b03169052565b5060a0830151612fad60a08401826001600160401b03169052565b5060c0830151612fc860c08401826001600160401b03169052565b5092915050565b5f60208284031215612fdf575f80fd5b8135612fea81612e16565b9392505050565b5f5b8381101561300b578181015183820152602001612ff3565b50505f910152565b602081525f8251806020840152613031816040850160208701612ff1565b601f01601f19169190910160400192915050565b5f60208284031215613055575f80fd5b5051919050565b5f808335601e19843603018112613071575f80fd5b8301803591506001600160401b0382111561308a575f80fd5b6020019150600581901b3603821315612b25575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130c9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613109576131096130d3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613137576131376130d3565b604052919050565b5f6001600160401b03821115613157576131576130d3565b50601f01601f191660200190565b5f60608236031215613175575f80fd5b61317d6130e7565b82358152602061318e818501612eaa565b8183015260408401356001600160401b038111156131aa575f80fd5b840136601f8201126131ba575f80fd5b80356131cd6131c88261313f565b61310f565b81815236848385010111156131e0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613255818460208a01612ff1565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613285816028840160208801612ff1565b016028019695505050505050565b5f82516130c9818460208701612ff1565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c576132a4565b5f63ffffffff8083168181036132e3576132e36132a4565b6001019392505050565b600181811c9082168061330157607f821691505b602082108103612e1057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613378816132ed565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c576132a4565b8082028115828204841417610c5757610c576132a4565b80518015158114612de2575f80fd5b5f806040838503121561343a575f80fd5b82516001600160401b0380821115613450575f80fd5b9084019060608287031215613463575f80fd5b61346b6130e7565b8251815260208084015161347e81612e16565b82820152604084015183811115613493575f80fd5b80850194505087601f8501126134a7575f80fd5b835192506134b76131c88461313f565b83815288828587010111156134ca575f80fd5b6134d984838301848801612ff1565b806040840152508195506134ee81880161341a565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135de575f80fd5b610c5482612eaa565b5f808335601e198436030181126135fc575f80fd5b8301803591506001600160401b03821115613615575f80fd5b602001915036819003821315612b25575f80fd5b601f8211156104d357805f5260205f20601f840160051c8101602085101561364e5750805b601f840160051c820191505b8181101561366d575f815560010161365a565b5050505050565b81516001600160401b0381111561368d5761368d6130d3565b6136a18161369b84546132ed565b84613629565b602080601f8311600181146136d4575f84156136bd5750858301515b5f19600386901b1c1916600185901b17855561372b565b5f85815260208120601f198616915b82811015613702578886015182559484019460019091019084016136e3565b508582101561371f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fc857612fc86132a4565b6001600160401b03818116838216019080821115612fc857612fc86132a4565b6001600160401b03818116838216028082169190828114613796576137966132a4565b505092915050565b5f602082840312156137ae575f80fd5b813560ff81168114612fea575f80fd5b5f6001600160401b038083168181036132e3576132e36132a456fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161396538038061396583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138188061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612daa565b61030c565b005b610173610143366004612daa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612dd9565b6104ca565b6101336101a7366004612e1c565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e52565b6105e6565b6101ef6101ea366004612daa565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612eb2565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612daa565b610c5d565b6101336102a1366004612dd9565b610c72565b6102686005600160991b0181565b6101336102c2366004612daa565b610e2a565b610217601481565b6102e26102dd366004612daa565b610f39565b60405161017d9190612f0b565b6101ef6202a30081565b610133610307366004612fc1565b611001565b5f8181525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff16600581111561035957610359612ef7565b600581111561036a5761036a612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612ef7565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61103e565b6040518263ffffffff1660e01b81526004016104849190613005565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613037565b50505050565b6104d381611263565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b61059787876115ad565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137cc8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613037565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fc1565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561304e565b91505f90508435602086013560146107fb6060890160408a01612fc1565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961304e565b8363ffffffff1681811061089157610891613093565b90506020028101906108a391906130a7565b6108ac90613157565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131ee565b84825f0151836020015184604001516040516020016109019493929190613236565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613285565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613037565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612ef7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132aa565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132bd565b905061085f565b50600584018190555f610b3c866115c7565b90505f610b4c82604001516117a1565b905080600285604051610b5f9190613285565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613037565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f39565b6080015192915050565b610c3661190a565b610c3f5f611965565b565b5f610c4a61190a565b610c5483836119d5565b90505b92915050565b610c6561190a565b610c6e81611f3a565b5050565b5f805160206137cc8339815191525f610c8a836115c7565b90505f80610c9b83604001516121b5565b9150915080610cfd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d17906132df565b9050118015610d49575060015f83815260088601602052604090205460ff166005811115610d4757610d47612ef7565b145b610d655760405162461bcd60e51b815260040161043a90613311565b5f8281526007850160205260408120610d7d91612d1f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137cc833981519152929190610e72906132df565b9050118015610ea4575060015f83815260088301602052604090205460ff166005811115610ea257610ea2612ef7565b145b610ec05760405162461bcd60e51b815260040161043a90613311565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef99190600401613358565b6020604051808303815f875af1158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613037565b610f41612d56565b5f8281525f805160206137ec833981519152602052604090819020815160e0810190925280545f805160206137cc833981519152929190829060ff166005811115610f8e57610f8e612ef7565b6005811115610f9f57610f9f612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61100961190a565b6001600160a01b03811661103257604051631e4fbdf760e01b81525f600482015260240161043a565b61103b81611965565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110b7576110778160016133e2565b6110829060086133f5565b5081515f9083908390811061109957611099613093565b60200101906001600160f81b03191690815f1a905350600101611063565b505f5b6004811015611122576110ce8160036133e2565b6110d99060086133f5565b600263ffffffff16901c60f81b828260026110f491906132aa565b8151811061110457611104613093565b60200101906001600160f81b03191690815f1a9053506001016110ba565b505f5b60208110156111845761113981601f6133e2565b6111449060086133f5565b86901c60f81b826111568360066132aa565b8151811061116657611166613093565b60200101906001600160f81b03191690815f1a905350600101611125565b505f5b60088110156111ef5761119b8160076133e2565b6111a69060086133f5565b6001600160401b038616901c60f81b826111c18360266132aa565b815181106111d1576111d1613093565b60200101906001600160f81b03191690815f1a905350600101611187565b505f5b600881101561125a576112068160076133e2565b6112119060086133f5565b6001600160401b038516901c60f81b8261122c83602e6132aa565b8151811061123c5761123c613093565b60200101906001600160f81b03191690815f1a9053506001016111f2565b50949350505050565b5f61126c612d56565b5f805160206137cc8339815191525f611284856115c7565b90505f8061129583604001516121b5565b9150915080156112fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561132b5761132b612ef7565b600581111561133c5761133c612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113ad576113ad612ef7565b14806113cb57506001825160058111156113c9576113c9612ef7565b145b61142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561143f5761143f612ef7565b0361144c57506004611450565b5060055b6020808301515f9081526009880190915260408120558181600581111561147957611479612ef7565b9081600581111561148c5761148c612ef7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156114c0576114c0612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561157457611574612ef7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6115b5612356565b6115be8261239f565b610c6e816123b8565b60408051606080820183525f8083526020830181905292820152905f805160206137cc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611663919081019061341b565b91509150806116c35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146117265760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146117c35760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015611812576117da8160016133e2565b6117e59060086133f5565b61ffff168482815181106117fb576117fb613093565b016020015160f81c901b91909117906001016117c6565b5061ffff8116156118355760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156118905761184c8160036133e2565b6118579060086133f5565b63ffffffff16856118698360026132aa565b8151811061187957611879613093565b016020015160f81c901b9190911790600101611838565b5063ffffffff8116156118b55760405162461bcd60e51b815260040161043a90613579565b5f805b602081101561125a576118cc81601f6133e2565b6118d79060086133f5565b866118e38360066132aa565b815181106118f3576118f3613093565b016020015160f81c901b91909117906001016118b8565b3361193c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611a605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137cc83398151915242611a7f60408601602087016135c0565b6001600160401b031611611af15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b0160408501602086016135c0565b6001600160401b0316611b176202a300426132aa565b11611b8a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611be25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c115760405162461bcd60e51b815260040161043a906131ee565b6030611c2060408601866135d9565b905014611c855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611c8f835f6123c9565b5f80611d296040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cd491906135c0565b6001600160401b03168152602001611cef60408a018a6135d9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125d7565b5f82815260078601602052604090209193509150611d478282613666565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d74908590600401613005565b6020604051808303815f875af1158015611d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db49190613037565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e2c57611e2c612ef7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f0c918e01908e016135c0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f42612d56565b5f8281525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff166005811115611f8f57611f8f612ef7565b6005811115611fa057611fa0612ef7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201257612012612ef7565b1461206e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156120b2576120b2612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61215e8582612986565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121d85760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015612227576121ef8160016133e2565b6121fa9060086133f5565b61ffff1685828151811061221057612210613093565b016020015160f81c901b91909117906001016121db565b5061ffff81161561224a5760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156122a5576122618160036133e2565b61226c9060086133f5565b63ffffffff168661227e8360026132aa565b8151811061228e5761228e613093565b016020015160f81c901b919091179060010161224d565b5063ffffffff81166003146122cc5760405162461bcd60e51b815260040161043a90613579565b5f805b6020811015612321576122e381601f6133e2565b6122ee9060086133f5565b876122fa8360066132aa565b8151811061230a5761230a613093565b016020015160f81c901b91909117906001016122cf565b505f8660268151811061233657612336613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123a7612356565b6123af612add565b61103b81612ae5565b6123c0612356565b61103b81612c87565b5f805160206137cc8339815191525f6001600160401b0380841690851611156123fd576123f68385613725565b905061240a565b6124078484613725565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061246c575060028401548151612468916001600160401b0316906132aa565b8210155b15612492576001600160401b0383166060820152818152604081015160208201526124b1565b82816060018181516124a49190613745565b6001600160401b03169052505b60608101516124c1906064613765565b602082015160028601546001600160401b0392909216916124ec9190600160401b900460ff166133f5565b10156125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161256b91906132aa565b9052506040810180516001600160401b038716919061258b9083906133e2565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126b8576126788160016133e2565b6126839060086133f5565b5081515f9083908390811061269a5761269a613093565b60200101906001600160f81b03191690815f1a905350600101612664565b505f5b6004811015612720576126cf8160036133e2565b6126da9060086133f5565b600160ff919091161c60f81b826126f28360026132aa565b8151811061270257612702613093565b60200101906001600160f81b03191690815f1a9053506001016126bb565b505f5b602081101561277d578451816020811061273f5761273f613093565b1a60f81b8261274f8360066132aa565b8151811061275f5761275f613093565b60200101906001600160f81b03191690815f1a905350600101612723565b505f5b60208110156127dd578460200151816020811061279f5761279f613093565b1a60f81b826127af8360266132aa565b815181106127bf576127bf613093565b60200101906001600160f81b03191690815f1a905350600101612780565b505f5b6008811015612851576127f48160076133e2565b6127ff9060086133f5565b60ff1685604001516001600160401b0316901c60f81b8282604661282391906132aa565b8151811061283357612833613093565b60200101906001600160f81b03191690815f1a9053506001016127e0565b505f5b60308110156128bc578460800151818151811061287357612873613093565b01602001516001600160f81b0319168261288e83604e6132aa565b8151811061289e5761289e613093565b60200101906001600160f81b03191690815f1a905350600101612854565b505f5b600881101561292e576128d38160076133e2565b6128de9060086133f5565b60608601516001600160401b0390811691161c60f81b8261290083607e6132aa565b8151811061291057612910613093565b60200101906001600160f81b03191690815f1a9053506001016128bf565b5060028160405161293f9190613285565b602060405180830381855afa15801561295a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061297d9190613037565b94909350915050565b5f8281525f805160206137ec833981519152602052604081206002015481905f805160206137cc83398151915290600160801b90046001600160401b03166129ce85826123c9565b5f6129d887612c8f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a288a858b61103e565b6040518263ffffffff1660e01b8152600401612a449190613005565b6020604051808303815f875af1158015612a60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a849190613037565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f612356565b612aed612356565b80355f805160206137cc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b396080840160608501613790565b60ff161115612ba65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612bb76080840160608501613790565b60ff1611612c1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c2f6080830160608401613790565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612c6060608301604084016135c0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611009612356565b5f8181525f805160206137ec8339815191526020526040812060020180545f805160206137cc83398151915291600160401b9091046001600160401b0316906008612cd9836137b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d2b906132df565b5f825580601f10612d3a575050565b601f0160209004905f5260205f209081019061103b9190612d92565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612da6575f8155600101612d93565b5090565b5f60208284031215612dba575f80fd5b5035919050565b803563ffffffff81168114612dd4575f80fd5b919050565b5f60208284031215612de9575f80fd5b610c5482612dc1565b5f60808284031215612e02575f80fd5b50919050565b6001600160a01b038116811461103b575f80fd5b5f8060a08385031215612e2d575f80fd5b612e378484612df2565b91506080830135612e4781612e08565b809150509250929050565b5f8060408385031215612e63575f80fd5b82356001600160401b03811115612e78575f80fd5b612e8485828601612df2565b925050612e9360208401612dc1565b90509250929050565b80356001600160401b0381168114612dd4575f80fd5b5f8060408385031215612ec3575f80fd5b82356001600160401b03811115612ed8575f80fd5b830160608186031215612ee9575f80fd5b9150612e9360208401612e9c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6960608401826001600160401b03169052565b506080830151612f8460808401826001600160401b03169052565b5060a0830151612f9f60a08401826001600160401b03169052565b5060c0830151612fba60c08401826001600160401b03169052565b5092915050565b5f60208284031215612fd1575f80fd5b8135612fdc81612e08565b9392505050565b5f5b83811015612ffd578181015183820152602001612fe5565b50505f910152565b602081525f8251806020840152613023816040850160208701612fe3565b601f01601f19169190910160400192915050565b5f60208284031215613047575f80fd5b5051919050565b5f808335601e19843603018112613063575f80fd5b8301803591506001600160401b0382111561307c575f80fd5b6020019150600581901b3603821315612ad6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e9c565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613247818460208a01612fe3565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613277816028840160208801612fe3565b016028019695505050505050565b5f82516130bb818460208701612fe3565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c57613296565b5f63ffffffff8083168181036132d5576132d5613296565b6001019392505050565b600181811c908216806132f357607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461336a816132df565b806020870152604060018084165f811461338b57600181146133a7576133d4565b60ff19851660408a0152604084151560051b8a010195506133d4565b895f5260205f205f5b858110156133cb5781548b82018601529083019088016133b0565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c57613296565b8082028115828204841417610c5757610c57613296565b80518015158114612dd4575f80fd5b5f806040838503121561342c575f80fd5b82516001600160401b0380821115613442575f80fd5b9084019060608287031215613455575f80fd5b61345d6130d9565b8251815260208084015161347081612e08565b82820152604084015183811115613485575f80fd5b80850194505087601f850112613499575f80fd5b835192506134a96131ba84613131565b83815288828587010111156134bc575f80fd5b6134cb84838301848801612fe3565b806040840152508195506134e081880161340c565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135d0575f80fd5b610c5482612e9c565b5f808335601e198436030181126135ee575f80fd5b8301803591506001600160401b03821115613607575f80fd5b602001915036819003821315612ad6575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156136405750805b601f840160051c820191505b8181101561365f575f815560010161364c565b5050505050565b81516001600160401b0381111561367f5761367f6130c5565b6136938161368d84546132df565b8461361b565b602080601f8311600181146136c6575f84156136af5750858301515b5f19600386901b1c1916600185901b17855561371d565b5f85815260208120601f198616915b828110156136f4578886015182559484019460019091019084016136d5565b508582101561371157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fba57612fba613296565b6001600160401b03818116838216019080821115612fba57612fba613296565b6001600160401b0381811683821602808216919082811461378857613788613296565b505092915050565b5f602082840312156137a0575f80fd5b813560ff81168114612fdc575f80fd5b5f6001600160401b038083168181036132d5576132d561329656fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index db4d6cb92..0e5987584 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -13,12 +13,13 @@ import { ERC20Burnable, ERC20 } from "@openzeppelin/contracts@5.0.2/token/ERC20/extensions/ERC20Burnable.sol"; +import {IERC20Mintable} from "../staking/interfaces/IERC20Mintable.sol"; -contract ExampleERC20 is ERC20Burnable { +contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; string private constant _TOKEN_SYMBOL = "EXMP"; - uint256 private constant _MAX_MINT = 1e16; + uint256 private constant _MAX_MINT = 1e19; constructor() ERC20(_TOKEN_NAME, _TOKEN_SYMBOL) { _mint(msg.sender, 1e28); @@ -30,4 +31,11 @@ contract ExampleERC20 is ERC20Burnable { _mint(msg.sender, amount); } + + function mint(address account, uint256 amount) external { + // Can only mint 10 at a time. + require(amount <= _MAX_MINT, "ExampleERC20: max mint exceeded"); + + _mint(account, amount); + } } diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index ba72b68bd..bb4756b94 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; import {IERC20TokenStakingManager} from "./interfaces/IERC20TokenStakingManager.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {IERC20Mintable} from "./interfaces/IERC20Mintable.sol"; import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; @@ -21,13 +21,13 @@ contract ERC20TokenStakingManager is PoSValidatorManager, IERC20TokenStakingManager { - using SafeERC20 for IERC20; - using SafeERC20TransferFrom for IERC20; + using SafeERC20 for IERC20Mintable; + using SafeERC20TransferFrom for IERC20Mintable; // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ERC20TokenStakingManager struct ERC20TokenStakingManagerStorage { - IERC20 _token; + IERC20Mintable _token; uint8 _tokenDecimals; } // solhint-enable private-vars-leading-underscore @@ -63,7 +63,7 @@ contract ERC20TokenStakingManager is */ function initialize( PoSValidatorManagerSettings calldata settings, - IERC20 token + IERC20Mintable token ) external reinitializer(2) { __ERC20TokenStakingManager_init(settings, token); } @@ -71,14 +71,17 @@ contract ERC20TokenStakingManager is // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init( PoSValidatorManagerSettings calldata settings, - IERC20 token + IERC20Mintable token ) internal onlyInitializing { __POS_Validator_Manager_init(settings); __ERC20TokenStakingManager_init_unchained(token); } // solhint-disable func-name-mixedcase - function __ERC20TokenStakingManager_init_unchained(IERC20 token) internal onlyInitializing { + function __ERC20TokenStakingManager_init_unchained(IERC20Mintable token) + internal + onlyInitializing + { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); $._token = token; @@ -116,7 +119,12 @@ contract ERC20TokenStakingManager is return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); } - function _unlock(uint256 value, address to) internal virtual override { + function _unlock(address to, uint256 value) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } + + function _reward(address account, uint256 amount) internal virtual override { + ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); + $._token.mint(account, amount); + } } diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 981a9db95..79740d61a 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -10,6 +10,8 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculator is IRewardCalculator { uint256 public constant SECONDS_IN_YEAR = 31536000; + uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + uint64 public immutable rewardBasisPoints; constructor(uint64 rewardBasisPoints_) { @@ -21,11 +23,23 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 validatorStartTime, + uint64 stakingStartTime, + uint64 stakingEndTime, + uint64 uptimeSeconds, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 1000; + // Equivalent to uptimeSeconds/(validator.endedAt - validator.startedAt) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 + // Rearranged to prevent integer division truncation. + if ( + uptimeSeconds * 100 + < (stakingEndTime - validatorStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + return 0; + } + + return (stakeAmount * rewardBasisPoints * (stakingEndTime - stakingStartTime)) + / SECONDS_IN_YEAR / 10000; } } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index ea0324160..9209ef83f 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -6,6 +6,8 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; +import {INativeMinter} from + "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; @@ -21,6 +23,9 @@ contract NativeTokenStakingManager is { using Address for address payable; + INativeMinter public constant NATIVE_MINTER = + INativeMinter(0x0200000000000000000000000000000000000001); + constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { _disableInitializers(); @@ -80,7 +85,11 @@ contract NativeTokenStakingManager is return value; } - function _unlock(uint256 value, address to) internal virtual override { + function _unlock(address to, uint256 value) internal virtual override { payable(to).sendValue(value); } + + function _reward(address account, uint256 amount) internal virtual override { + NATIVE_MINTER.mintNativeCoin(account, amount); + } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 35926937c..f661d7c2c 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -54,8 +54,14 @@ abstract contract PoSValidatorManager is IRewardCalculator _rewardCalculator; /// @notice Maps the validation ID to its requirements. mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; - /// @notice Maps the delegationID to the delegator information. + /// @notice Maps the delegation ID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; + /// @notice Maps the delegation ID to its pending staking rewards. + mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; + /// @notice Maps the validation ID to its pending staking rewards. + mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; + /// @notice Saves the uptime of a pending completed or completed validation period so that delegators can collect rewards. + mapping(bytes32 validationID => uint64) _completedValidationUptimeSeconds; } // solhint-enable private-vars-leading-underscore @@ -130,32 +136,91 @@ abstract contract PoSValidatorManager is $._rewardCalculator = rewardCalculator; } + function claimDelegationFees(bytes32 validationID) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = getValidator(validationID); + + require( + validator.status == ValidatorStatus.Completed, + "PoSValidatorManager: validation period not completed" + ); + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + + uint256 rewards = $._redeemableValidatorRewards[validationID]; + delete $._redeemableValidatorRewards[validationID]; + _reward($._validatorRequirements[validationID].owner, rewards); + } + function initializeEndValidation( bytes32 validationID, bool includeUptimeProof, uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - // Check that minimum stake duration has passed - Validator memory validator = getValidator(validationID); + + Validator memory validator = _initializeEndValidation(validationID); + + // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. + if (!_isPoSValidator(validationID)) { + return; + } + + // PoS validations can only be ended by their owners. require( - block.timestamp + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + + // Check that minimum stake duration has passed. + require( + validator.endedAt >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, "PoSValidatorManager: minimum stake duration not met" ); if (includeUptimeProof) { - _getUptime(validationID, messageIndex); + // Uptime proofs include the absolute number of seconds the validator has been active. + uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + // Save this value for use by this validator's delegators. + $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + + $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(validator.startingWeight), + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, + stakingEndTime: validator.endedAt, + uptimeSeconds: uptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); } - // TODO: Calculate the reward for the validator, but do not unlock it - - _initializeEndValidation(validationID); } function completeEndValidation(uint32 messageIndex) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + (bytes32 validationID, Validator memory validator) = _completeEndValidation(messageIndex); - _unlock(validator.startingWeight, $._validatorRequirements[validationID].owner); + + // Return now if this was originally a PoA validator that was later migrated to this PoS manager, + // or the validator was part of the initial validator set. + if (!_isPoSValidator(validationID)) { + return; + } + + address owner = $._validatorRequirements[validationID].owner; + // The validator can either be Completed or Invalidated here. We only grant rewards for Completed. + if (validator.status == ValidatorStatus.Completed) { + uint256 rewards = $._redeemableValidatorRewards[validationID]; + delete $._redeemableValidatorRewards[validationID]; + _reward(owner, rewards); + } + + // We unlock the stake whether the validation period is completed or invalidated. + _unlock(owner, weightToValue(validator.startingWeight)); } function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { @@ -226,7 +291,7 @@ abstract contract PoSValidatorManager is } function _lock(uint256 value) internal virtual returns (uint256); - function _unlock(uint256 value, address to) internal virtual; + function _unlock(address to, uint256 value) internal virtual; function _initializeDelegatorRegistration( bytes32 validationID, @@ -323,22 +388,19 @@ abstract contract PoSValidatorManager is }); } + /** + * @notice See {INativeTokenStakingManager-initializeValidatorRegistration}. + * Begins the validator registration process. Locks the provided native asset in the contract as the stake. + */ function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - bytes32 validationID = $._delegatorStakes[delegationID].validationID; - - uint64 uptime; - if (includeUptimeProof) { - uptime = _getUptime(validationID, messageIndex); - } - - // TODO: Calculate the delegator's reward, but do not unlock it Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; Validator memory validator = getValidator(validationID); // Ensure the delegator is active @@ -355,19 +417,36 @@ abstract contract PoSValidatorManager is // initialize the removal. delegator.status = DelegatorStatus.PendingRemoved; + uint64 validatorUptimeSeconds; if (validator.status == ValidatorStatus.Active) { + if (includeUptimeProof) { + // Uptime proofs include the absolute number of seconds the validator has been active. + validatorUptimeSeconds = _getUptime(validationID, messageIndex); + } uint64 newValidatorWeight = validator.weight - delegator.weight; (delegator.endingNonce,) = _setValidatorWeight(validationID, newValidatorWeight); delegator.endedAt = uint64(block.timestamp); } else { - // If the validation period has already ended, there won't be any uptime message able to be - // provided in the call to initializeEndDelegation, and the uptime submitted when the validator - // was ended should be used to calculate the delegators rewards. + // If the validation period has already ended, we have saved the uptime. + // Further, it is impossible to retrieve an uptime proof for an already ended validation, + // so there's no need to check any uptime proof provided in this function call. + validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; + delegator.endingNonce = validator.messageNonce; delegator.endedAt = validator.endedAt; } + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(delegator.weight), + validatorStartTime: validator.startedAt, + stakingStartTime: delegator.startedAt, + stakingEndTime: delegator.endedAt, + uptimeSeconds: validatorUptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); + $._delegatorStakes[delegationID] = delegator; emit DelegatorRemovalInitialized({ @@ -416,6 +495,10 @@ abstract contract PoSValidatorManager is ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); Validator memory validator = getValidator(validationID); + Delegator memory delegator = $._delegatorStakes[delegationID]; + // Once this function completes, the delegation is completed and we can clear it from state. + delete $._delegatorStakes[delegationID]; + // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. @@ -425,29 +508,37 @@ abstract contract PoSValidatorManager is // a weight update using a higher nonce (which implicitly includes the delegation's weight update) // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain // is only willing to sign the latest weight update. - require( - $._delegatorStakes[delegationID].endingNonce <= nonce, - "PoSValidatorManager: nonce does not match" - ); + require(delegator.endingNonce <= nonce, "PoSValidatorManager: nonce does not match"); // Ensure the delegator is pending removed. Since anybody can call this function once // end delegation has been initialized, we need to make sure that this function is only // callable after that has been done. require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, + delegator.status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegation not pending added" ); - // Update the delegator status - $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; + uint256 rewards = $._redeemableDelegatorRewards[delegationID]; + delete $._redeemableDelegatorRewards[delegationID]; - Delegator memory delegator = $._delegatorStakes[delegationID]; - _unlock(delegator.weight, delegator.owner); - // TODO: issue rewards + uint256 validatorFees = + rewards * $._validatorRequirements[validationID].delegationFeeBips / 10000; + + // Allocate the delegation fees to the validator. + $._redeemableValidatorRewards[validationID] += validatorFees; + + // Reward the remaining tokens to the delegator. + uint256 delegatorRewards = rewards - validatorFees; + _reward(delegator.owner, delegatorRewards); - emit DelegationEnded(delegationID, validationID, nonce); + // Unlock the delegator's stake. + _unlock(delegator.owner, weightToValue(delegator.weight)); + + emit DelegationEnded(delegationID, validationID, nonce, delegatorRewards, validatorFees); } + function _reward(address account, uint256 amount) internal virtual; + function _isPoSValidator(bytes32 validationID) internal view returns (bool) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); return $._validatorRequirements[validationID].owner != address(0); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 7ed9cd005..f67def6b7 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -331,7 +331,11 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida * Any rewards for this validation period will stop accruing when this function is called. * @param validationID The ID of the validation being ended. */ - function _initializeEndValidation(bytes32 validationID) internal virtual { + function _initializeEndValidation(bytes32 validationID) + internal + virtual + returns (Validator memory) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the validation period is active. @@ -357,6 +361,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Emit the event to signal the start of the validator removal process. emit ValidatorRemovalInitialized(validationID, messageID, validator.weight, block.timestamp); + + return validator; } /** diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol new file mode 100644 index 000000000..dd2225ceb --- /dev/null +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -0,0 +1,18 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; + +interface IERC20Mintable is IERC20 { + /** + * @notice Mint tokens to the specified address. + * @param account The address to mint tokens to. + * @param amount How many tokens to mint. + * @dev This function should have appropriate user controls to ensure that only the staking contract can mint. + */ + function mint(address account, uint256 amount) external; +} diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 6929d8f06..b4d8cefff 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -95,7 +95,11 @@ interface IPoSValidatorManager is IValidatorManager { * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce + bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, + uint256 rewards, + uint256 fees ); /** @@ -134,7 +138,9 @@ interface IPoSValidatorManager is IValidatorManager { * Note that this function can only be called by the address that registered the delegation. * @param delegationID The ID of the delegation being removed. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. - * If no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. + * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} + * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof + * is provided, the validation uptime for the delegation period will be assumed to be 0. * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the * uptime proof. */ @@ -163,4 +169,11 @@ interface IPoSValidatorManager is IValidatorManager { * @param delegationID The ID of the delegation being removed. */ function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external; + + /** + * @notice Withdraws the delegation fees from completed delegations to the owner of the validator. + * Can currently only be called once the validator has completed its validation period. + * @param validationID The ID of the validation being ended. + */ + function claimDelegationFees(bytes32 validationID) external; } diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 51fffb6a7..b7f9a35c4 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,8 +8,10 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 validatorStartTime, + uint64 stakingStartTime, + uint64 stakingEndTime, + uint64 uptimeSeconds, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 9db5522c1..ebad4feae 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -7,6 +7,7 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import { ValidatorManagerSettings, ValidatorRegistrationInput @@ -16,20 +17,22 @@ import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {IERC20Mintable} from "../interfaces/IERC20Mintable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { - using SafeERC20 for IERC20; + using SafeERC20 for IERC20Mintable; ERC20TokenStakingManager public app; - IERC20 public token; + IERC20Mintable public token; function setUp() public virtual { // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -43,7 +46,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: rewardCalculator }), token ); @@ -172,23 +175,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); vm.expectRevert(_formatErrorMessage("invalid min stake duration")); app.initializeValidatorRegistration( - input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - DEFAULT_MINIMUM_STAKE_DURATION - 1, - stakeAmount - ); - } - - function testInvalidValidatorDelegationFee() public { - ValidatorRegistrationInput memory input = - ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); - uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - app.initializeValidatorRegistration( - input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, - DEFAULT_MINIMUM_STAKE_DURATION, - stakeAmount + input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); } @@ -209,7 +196,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, _weightToValue(weight) ); @@ -241,6 +228,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.expectCall(address(token), abi.encodeCall(IERC20Mintable.mint, (account, amount))); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index dcee84052..87b18020c 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -7,13 +7,15 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculatorTest is Test { - ExampleRewardCalculator public exampleRewardCalculator; + IRewardCalculator public exampleRewardCalculator; uint256 public constant DEFAULT_STAKE_AMOUNT = 1e12; uint64 public constant DEFAULT_START_TIME = 1000; uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seonds + uint64 public constant DEFAULT_UPTIME = (DEFAULT_END_TIME - DEFAULT_START_TIME) * 80 / 100; uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; function setUp() public { @@ -21,9 +23,28 @@ contract ExampleRewardCalculatorTest is Test { } function testRewardCalculation() public view { - uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 - ); - assertEq(output, 42e9); + uint256 output = exampleRewardCalculator.calculateReward({ + stakeAmount: DEFAULT_STAKE_AMOUNT, + validatorStartTime: DEFAULT_START_TIME, + stakingStartTime: DEFAULT_START_TIME, + stakingEndTime: DEFAULT_END_TIME, + uptimeSeconds: DEFAULT_UPTIME, + initialSupply: 0, + endSupply: 0 + }); + assertEq(output, 42e8); + } + + function testInsufficientUptime() public view { + uint256 output = exampleRewardCalculator.calculateReward({ + stakeAmount: DEFAULT_STAKE_AMOUNT, + validatorStartTime: DEFAULT_START_TIME, + stakingStartTime: DEFAULT_START_TIME, + stakingEndTime: DEFAULT_END_TIME, + uptimeSeconds: DEFAULT_UPTIME - 1, + initialSupply: 0, + endSupply: 0 + }); + assertEq(output, 0); } } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 2cf4243a7..c607e0f01 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -13,7 +13,10 @@ import { } from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; +import {INativeMinter} from + "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks @@ -23,6 +26,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function setUp() public virtual { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -36,7 +40,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: rewardCalculator }) ); validatorManager = app; @@ -170,7 +174,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration{value: _weightToValue(weight)}( - input, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION + input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION ); } @@ -194,6 +198,23 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.mockCall( + address(app.NATIVE_MINTER()), + abi.encodeCall(INativeMinter.mintNativeCoin, (account, amount)), + "" + ); + // empty calldata implies the receive function will be called: + vm.mockCall({ + callee: account, + msgValue: amount, + data: "", // implies receive() + returnData: "" + }); + // Units tests don't have access to the native minter precompile, so use vm.deal instead. + vm.deal(account, account.balance + amount); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index ac924187d..38b9fe90e 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -57,7 +57,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID) internal virtual override { + function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index e728d9402..001260350 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -5,6 +5,7 @@ pragma solidity 0.8.25; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import { @@ -12,7 +13,7 @@ import { IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; +import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -22,14 +23,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + address public constant DEFAULT_VALIDATOR_OWNER_ADDRESS = + address(0x2345234523452345234523452345234523452345); + uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; + uint16 public constant DEFAULT_DELEGATION_FEE_BIPS = 150; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; + uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; + IRewardCalculator public rewardCalculator; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); @@ -62,14 +69,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegationEnded( - bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce + bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, + uint256 rewards, + uint256 fees ); function testDelegationFeeBipsTooLow() public { - // ValidatorRegistrationInput calldata registrationInput, - // uint16 delegationFeeBips, - // uint64 minStakeDuration, - // uint256 stakeAmount ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, @@ -109,7 +116,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("invalid min stake duration")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, DEFAULT_MINIMUM_STAKE_AMOUNT ); @@ -124,7 +131,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("stake amount too low")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 ); @@ -139,7 +146,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("stake amount too high")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 ); @@ -406,6 +413,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); } + function testInitializeEndValidationNotOwner() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + vm.prank(address(1)); + vm.expectRevert("PoSValidatorManager: validator not owned by sender"); + posValidatorManager.initializeEndValidation(validationID, false, 0); + } + function testInitializeEndDelegation() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -434,6 +455,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -468,6 +490,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -478,6 +501,23 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.resendUpdateDelegation(delegationID); } + function testResendEndValidation() public override { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + validatorManager.resendEndValidatorMessage(validationID); + } + function testCompleteEndDelegation() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -495,33 +535,49 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpCompleteDelegatorRegistration({ + validationID: validationID, + delegationID: delegationID, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + uint64 delgationEndTime = + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; _setUpInitializeEndDelegation({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: delgationEndTime, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - address delegator = DEFAULT_DELEGATOR_ADDRESS; - uint256 balanceBefore = _getStakeAssetBalance(delegator); - _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: delgationEndTime, + uptimeSeconds: delgationEndTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); - _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; - uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; - require( - balanceChange >= DEFAULT_DELEGATOR_WEIGHT, - "delegator should have received their stake back" - ); + _setUpCompleteEndDelegation({ + validationID: validationID, + delegationID: delegationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedReward: expectedDelegatorReward, + expectedFees: expectedValidatorFees, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); } function testCompleteEndDelegationWrongNonce() public { @@ -573,6 +629,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -581,6 +638,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -647,6 +705,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, + startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -655,16 +714,40 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, + startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 }); + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); + + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; + // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation({ + validationID: validationID, + delegationID: delegationID1, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedReward: expectedDelegatorReward, + expectedFees: expectedValidatorFees, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); } - function testCompleteEndValidation() public override { + function testCompleteEndValidation() public virtual override { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -672,17 +755,39 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true }); - uint256 balanceBefore = _getStakeAssetBalance(address(this)); - - _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); - _testCompleteEndValidation(validationID); + _setUpCompleteEndValidation({ + validationID: validationID, + validatorOwner: address(this), + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT + }); + } - uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; - require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + function testInitializeEndValidation() public virtual override { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); } function testValueToWeight() public view { @@ -712,8 +817,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 stakeAmount ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, false, 0); + function _initializeEndValidation( + bytes32 validationID, + bool includeUptime + ) internal virtual override { + return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); } function _initializeDelegatorRegistration( @@ -783,6 +891,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegatorAddress, bytes32 delegationID, + uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -791,6 +900,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, endDelegationTimestamp - startDelegationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit ValidatorWeightUpdate({ @@ -807,13 +921,43 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); vm.prank(delegatorAddress); - posValidatorManager.initializeEndDelegation(delegationID, false, 0); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); return delegationID; } + function _setUpCompleteEndValidation( + bytes32 validationID, + address validatorOwner, + uint256 expectedReward, + uint64 validatorWeight + ) internal { + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + uint256 balanceBefore = _getStakeAssetBalance(validatorOwner); + + _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); + _expectRewardIssuance(validatorOwner, expectedReward); + + posValidatorManager.completeEndValidation(0); + + assertEq( + _getStakeAssetBalance(validatorOwner), + balanceBefore + _weightToValue(validatorWeight) + expectedReward + ); + } + function _setUpCompleteEndDelegation( bytes32 validationID, bytes32 delegationID, + address delegator, + uint64 delegatorWeight, + uint256 expectedReward, + uint256 expectedFees, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -824,14 +968,27 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(delegationID, validationID, expectedNonce); + emit DelegationEnded( + delegationID, validationID, expectedNonce, expectedReward, expectedFees + ); + uint256 balanceBefore = _getStakeAssetBalance(delegator); + + _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); + _expectRewardIssuance(delegator, expectedReward); + posValidatorManager.completeEndDelegation(0, delegationID); + assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); + assertEq( + _getStakeAssetBalance(delegator), + balanceBefore + _weightToValue(delegatorWeight) + expectedReward + ); return delegationID; } function _getStakeAssetBalance(address account) internal virtual returns (uint256); function _expectStakeUnlock(address account, uint256 amount) internal virtual; + function _expectRewardIssuance(address account, uint256 amount) internal virtual; function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 22cc80c35..f9885b1e3 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -137,7 +137,7 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidation() public { + function testInitializeEndValidation() public virtual { _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -149,11 +149,7 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidationExcessiveChurn() public { - // TODO: implement - } - - function testResendEndValidation() public { + function testResendEndValidation() public virtual { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -179,7 +175,15 @@ abstract contract ValidatorManagerTest is Test { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); - _testCompleteEndValidation(validationID); + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + + validatorManager.completeEndValidation(0); } function testCompleteInvalidatedValidation() public { @@ -257,7 +261,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, false); } function _newNodeID() internal returns (bytes32) { @@ -339,6 +343,28 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp + ) internal returns (bytes32 validationID) { + return _setUpInitializeEndValidation({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + blsPublicKey: blsPublicKey, + registrationTimestamp: registrationTimestamp, + completionTimestamp: completionTimestamp, + includeUptime: false + }); + } + + function _setUpInitializeEndValidation( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory blsPublicKey, + uint64 registrationTimestamp, + uint64 completionTimestamp, + bool includeUptime ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ nodeID: nodeID, @@ -353,22 +379,17 @@ abstract contract ValidatorManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + if (includeUptime) { + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, completionTimestamp - registrationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + } vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID); - } - - function _testCompleteEndValidation(bytes32 validationID) internal virtual { - bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); - - validatorManager.completeEndValidation(0); + _initializeEndValidation(validationID, includeUptime); } function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { @@ -401,10 +422,14 @@ abstract contract ValidatorManagerTest is Test { } function _mockGetBlockchainID() internal { + _mockGetBlockchainID(DEFAULT_SOURCE_BLOCKCHAIN_ID); + } + + function _mockGetBlockchainID(bytes32 blockchainID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector), - abi.encode(DEFAULT_SOURCE_BLOCKCHAIN_ID) + abi.encode(blockchainID) ); vm.expectCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector) @@ -422,7 +447,7 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual; + function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 8334199eb..b93d76422 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,10 +16,12 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 ExampleRewardCalculator TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" +SUBNET_EVM_LIST="INativeMinter" + CONTRACT_LIST= HELP= while [ $# -gt 0 ]; do @@ -103,4 +105,11 @@ forge build --skip test --force --extra-output-files abi bin --contracts lib/ope cd $TELEPORTER_PATH/lib/openzeppelin-contracts/contracts/proxy/transparent generate_bindings "${contract_names[@]}" +contract_names=($SUBNET_EVM_LIST) +cd $TELEPORTER_PATH/ +forge build --skip test --force --extra-output-files abi bin --contracts lib/subnet-evm/contracts/contracts/interfaces + +cd $TELEPORTER_PATH/lib/subnet-evm/contracts/contracts/interfaces +generate_bindings "${contract_names[@]}" + exit 0 diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index 8a3d60960..2901f1f9b 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -85,7 +85,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a ValidatorSetSig message with mock ERC20 as the target contract // and mint 100 tokens as the TxPayload - callData, err := erc20ABI.Pack("mint", big.NewInt(100)) + callData, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(100)) Expect(err).Should(BeNil()) vssMessage1 := validatorsetsig.ValidatorSetSigMessage{ @@ -99,7 +99,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a second ValidatorSetSig message with mock ERC20 as the target contract // and mint 50 tokens as the TxPayload - callData2, err := erc20ABI.Pack("mint", big.NewInt(50)) + callData2, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(50)) Expect(err).Should(BeNil()) vssMessage2 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress, @@ -111,13 +111,18 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { } // Create a message for the case where validatorSetSig contract and targetContract are on the same chain. + // Construct a ValidatorSetSig message with mock ERC20 as the target contract + // and mint 100 tokens as the TxPayload + callData3, err := erc20ABI.Pack("mint", validatorSetSigContractAddress2, big.NewInt(100)) + Expect(err).Should(BeNil()) + vssMessage3 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress2, TargetContractAddress: exampleERC20ContractAddressB, TargetBlockchainID: subnetB.BlockchainID, Nonce: big.NewInt(0), Value: big.NewInt(0), - Payload: callData, + Payload: callData3, } // Create chain config file with off-chain validatorsetsig message diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index d8b7676e4..cda020dcc 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -46,6 +46,8 @@ func NativeDelegation(network interfaces.LocalNetwork) { pChainInfo, ) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerAddress) + _ = utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 80e668cb2..9a0974e61 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -51,6 +51,8 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerContractAddress) + _ = utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index ff5e4647f..e69b51b7c 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -10,7 +10,6 @@ import ( poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" . "github.com/onsi/gomega" @@ -153,6 +152,15 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, proxyAddress) + + rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( + ctx, + fundedKey, + subnetAInfo, + uint64(10), + ) + tx, err = posValidatorManager.Initialize( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ @@ -167,7 +175,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { MinimumStakeDuration: utils.DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: utils.DefaultMinDelegateFeeBips, MaximumStakeMultiplier: utils.DefaultMaxStakeMultiplier, - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 07872d456..ac75d4d02 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -24,10 +24,13 @@ import ( "github.com/ava-labs/awm-relayer/peers" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/eth/tracers" "github.com/ava-labs/subnet-evm/ethclient" subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ava-labs/subnet-evm/precompile/contracts/nativeminter" + nativeMinter "github.com/ava-labs/teleporter/abi-bindings/go/INativeMinter" "github.com/ava-labs/teleporter/tests/interfaces" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ethereum/go-ethereum/common" @@ -562,3 +565,20 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu messageCreator, ) } + +// Funded key must have admin access to set new admin. +func AddNativeMinterAdmin( + ctx context.Context, + subnet interfaces.SubnetTestInfo, + fundedKey *ecdsa.PrivateKey, + address common.Address, +) { + nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) + Expect(err).Should(BeNil()) + + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := nativeMinterPrecompile.SetAdmin(opts, address) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) +} diff --git a/tests/utils/staking.go b/tests/utils/staking.go index bcc9f2cf5..1c26f63c1 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -22,6 +22,7 @@ import ( predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/staking/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" @@ -77,6 +78,12 @@ func DeployAndInitializeNativeTokenStakingManager( senderKey, subnet, ) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -93,7 +100,7 @@ func DeployAndInitializeNativeTokenStakingManager( MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: DefaultMaxStakeMultiplier, - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) @@ -140,6 +147,12 @@ func DeployAndInitializeERC20TokenStakingManager( ) erc20Address, erc20 := DeployExampleERC20(ctx, senderKey, subnet) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -156,7 +169,7 @@ func DeployAndInitializeERC20TokenStakingManager( MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: DefaultMaxStakeMultiplier, - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, erc20Address, ) @@ -216,6 +229,27 @@ func DeployAndInitializePoAValidatorManager( return validatorManagerAddress, validatorManager } +func DeployExampleRewardCalculator( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + rewardBasisPoints uint64, +) (common.Address, *examplerewardcalculator.ExampleRewardCalculator) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, calculator, err := examplerewardcalculator.DeployExampleRewardCalculator( + opts, + subnet.RPCClient, + rewardBasisPoints, + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, calculator +} + // // Validator Set Initialization utils // diff --git a/tests/utils/warp-genesis-template.json b/tests/utils/warp-genesis-template.json index 9d221136e..5dab415be 100644 --- a/tests/utils/warp-genesis-template.json +++ b/tests/utils/warp-genesis-template.json @@ -28,7 +28,8 @@ "blockTimestamp": 0, "adminAddresses": [ "0xAcB633F5B00099c7ec187eB00156c5cd9D854b5B", - "0x3405506b3711859c5070949ed9b700c7ba7bf750" + "0x3405506b3711859c5070949ed9b700c7ba7bf750", + "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC" ] } },